Servlet,Filter,Listener 是 Javaweb 的三大组件, 给 Web 开发提供了很大的便利.
什么是 Filter?
Filter, 过滤器. 类似与生活中的净水器, 空气净化器.
JavaWeb 中 Filter 的作用: 当浏览器请求访问服务器的资源时, 过滤器可以将请求拦截下来, 完成一下特殊的功能. 例如: 登录验证, 统一编码处理, 敏感字符过滤等.
Filter 的基本使用
(1) 定义一个类, 实现接口 Filter.
(2) 实现 Filter 接口的方法
(3) 配置拦截路径. 可以用 Web.xml 进行配置; Servlet 3.0 以后还可以用注解进行配置.
示例 1(注解配置):
- @WebFilter("/index.jsp")
- public class FilterDemo1 implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("过滤请求 req 的代码");
- filterChain.doFilter(servletRequest,servletResponse); // 放行请求
- System.out.println("增强响应 resp 的代码");
- }
- @Override
- public void destroy() {
- }
- }
示例 2(Web.xml 配置):
- <?xml version="1.0" encoding="UTF-8"?>
- <Web-App xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- version="3.1">
- <filter>
- <filter-name>filter1</filter-name>
- <filter-class>com.chichung.Web.filter.FilterDemo1</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>filter1</filter-name>
- <url-pattern>/index.jsp</url-pattern>
- </filter-mapping>
- </Web-App>
上面两个示例的输出结果都是:
过滤请求 req 的代码
index...
增强响应 resp 的代码
说明, Filter 的执行顺序是:
(1) 执行过滤器放行代码上边的代码
(2) 执行放行代码 filterChain.doFilter(servletRequest,servletResponse)
(3) 执行放行后的资源 index.jsp
(4) 回来执行过滤器放行代码下边的代码
所以 Filter 可以对请求对象进行过滤, 还可以对响应对象进行功能上的增强, 再返回给客户端.
关于拦截的配置
上面讲了一下两种配置拦截的两种方式.
下面是拦截路径的几种方式:
(1) 具体资源路径: /index.jsp 只有访问 index.jsp 资源时, 过滤器才会被执行
(2) 拦截目录: /user/* 访问 / user 下的所有资源时, 过滤器都会被执行
(3) 后缀名拦截: *.jsp 访问所有后缀名为 jsp 资源时, 过滤器都会被执行
(4) 拦截所有资源:/* 访问所有资源时, 过滤器都会被执行
还有就是拦截方式的配置. 什么是拦截方式呢? 我们有些请求是直接访问 jsp 文件, 有些请求是先访问 Servlet, 然后 Servlet 通过请求转发到到 jsp 显示. 直接访问 jsp 文件我们可以用上面的示例代码解决, 但是请求转发或者其他方式呢?
* 注解配置:
* 设置 dispatcherTypes 属性
1. REQUEST: 默认值. 浏览器直接请求资源
2. FORWARD: 转发访问资源
3. INCLUDE: 包含访问资源
4. ERROR: 错误跳转资源
5. ASYNC: 异步访问资源
* Web.xml 配置
* 设置 < dispatcher></dispatcher > 标签即可
过滤器的生命周期
Filter 接口的三个方法:
1. init: 在服务器启动后, 会创建 Filter 对象, 然后调用 init 方法. 只执行一次. 用于加载资源
2. doFilter: 每一次请求被拦截资源时, 会执行. 执行多次
3. destroy: 在服务器关闭后, Filter 对象被销毁. 如果服务器是正常关闭, 则会执行 destroy 方法. 只执行一次. 用于释放资源
过滤器链 (配置多个过滤器)
执行顺序: 如果有两个过滤器: 过滤器 1 和过滤器 2
1. 过滤器 1
2. 过滤器 2
3. 资源执行
4. 过滤器 2
5. 过滤器 1
过滤器先后顺序问题:
1. 注解配置: 按照类名的字符串比较规则比较, 值小的先执行. 例如: AFilter 和 BFilter,AFilter 就先执行了.
2. Web.xml 配置: <filter-mapping > 谁定义在上边, 谁先执行.
来源: http://www.bubuko.com/infodetail-2945002.html