1、Filter简介
Filter 技术是servlet 2.3 新增加的功能。servlet2.3是sun公司于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
2、核心方法
3、Filterchain接口
在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。
返回值类型 | 方法 | 描述 |
---|---|---|
void | doFilter(ServletRequest request ,ServletResponse response) | 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。 |
4、简单使用
注解配置 @WebFilter("/*")
Filter解决乱码问题
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好 ServletDemo01");
System.out.println("01.....");
}
}
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好 ServletDemo02");
System.out.println("02.....");
}
}
@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter.......");
servletResponse.setContentType("text/html;charset=UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
5、配置方式
1)注解方式
@WebFilter("拦截路径")
2)xml配置文件
<filter>
<filter-name>filterDemo</filter-name>
<filter-class>com.codeui.top.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDemo</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
如果有多个过滤器,取决于过滤器映射的顺序
6、生命周期
创建:应用加载时实例化并执行init初始化方法
服务:提供服务过程,执行doFilter方法
销毁:当应用卸载或者服务器停止时,对象销毁,执行destroy方法
7、FilterConfig接口
FilterConfig作用是获取Filter的相关配置信息
返回值 | 方法名 | 作用 |
---|---|---|
String | getFilterName() | 获得过滤器名称 |
String | getInitParameter(String name) | 根据名称获取对应参数参数的值 |
Enumeration | getInitParameterNames() | 获取过滤器初始化参数名称的枚举 |
ServletContext | getServletContext() | 获取应用上下文ServletContext的对象 |
8、过滤器的五种拦截行为
我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo1</filter-class>
<!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行-->
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/ServletDemo1</url-pattern>
<!--过滤请求:默认值。-->
<dispatcher>REQUEST</dispatcher>
<!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作-->
<dispatcher>ERROR</dispatcher>
<!--过滤请求转发:当请求转发时,过滤器工作。-->
<dispatcher>FORWARD</dispatcher>
<!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含-->
<dispatcher>INCLUDE</dispatcher>
<!--过滤异步类型,它要求我们在filter标签中配置开启异步支持-->
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
评论区