JavaWeb三大组件之Filter
1.Filter是什么
首先,Filter与Servlet非常相似,都有三个生命周期方法、都是实现了各自接口的java类。不同点在于servlet主要负责处理请求,而filter主要负责拦截请求和放行。
Filter: 过滤器。 实质上就是实现了接口Filter的一个java类,不需要将它想象的过于复杂。
可以将其想象为生活中的一些例子。我认为最为贴切的就是坐飞机了,我们相当于来自浏览器的请求,检票员相当于Filter,是否能上飞机就相当于是否能访问服务器的资源。当我们的机票符合要求时,我们就可以顺利的坐上飞机。Filter的作用与之类似。
2.为什么要用Filter
1.统一编码。 浏览器通过http请求发送数据给Servlet,如果存在中文,就必须指定编码,否则就会乱码!
2. 敏感字符过滤。 就比如王者荣耀在对局时,如果你发一些不良的言论,系统会将敏感字符替代。如:你 ** 就是个 **
3. 资源访问限制。 限制用户访问某些资源时、在处理请求时提前处理某些资源、服务器响应的内容对其进行处理再返回。
…
好处:
- 减少代码的重用性。如:不需要在每一个Servlet中都指定编码
- 用户资源访问限制。
…
3.Filter怎么用
步骤:
- 定义一个类,实行接口
Filter
,部署到web中。 - 重写类中的方法。
- 配置拦截路径。
- web.xml
- 注解
写一个简单的过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//放行语句,作用:让下一个过滤器执行或访问目标资源。
chain.doFilter(req,resp);
}
@Override
public void destroy() {}
}
配置拦截路径:
- 方法一,通过web.xml。
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<!-- 拦截路径 -->
<url-pattern> /* </url-pattern>
</filter-mapping>
- 方法二,通过注解
@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")
可以简写为:
@WebFilter("/*")
4.Filter细节
4.1执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
4.2生命周期方法
- init: 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
- doFilter: 每一次请求被拦截资源时,会执行。执行多次
- destroy: 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
4.3过滤器配置详解
-
拦截路径配置。
/*
拦截所有资源 。 访问所有资源时,过滤器都会被执行。/user/*
拦截目录。 问/user下的所有资源时,过滤器都会被执行。/index.jsp
具体资源路径。 只有访问index.jsp资源时,过滤器才会被执行。*.jsp
后缀名拦截。 访问所有后缀名为jsp资源时,过滤器都会被执行。
-
拦截方式配置。(资源被访问的方式)
注解配置:设置dispatcherTypes属性
REQUEST
:默认值。浏览器直接请求资源FORWARD
:转发访问资源INCLUDE
:包含访问资源ERROR
:错误跳转资源ASYNC
:异步访问资源
5.过滤器链
概念: 请求访问服务器资源时,配置多个过滤器。
问题: 配置多个过滤器时,过滤器执行的先后顺序是按什么规律的?
问题探究: 配置两个过滤器并且资源拦截路径相同,进行实验。
实验结果:
画图更好的描述出这样一个过程。
结论: 过滤器先后顺序是按照类名的字符串比较规则比较,值小的先执行。如 FilterDemo3 和 FilterDemo4 ,字符串末尾 3 < 4,所以先执行过滤器FilterDemo3。