1.1 Filter 基本信息
Filter
,过滤器接口
。
对客户端向服务器发送的请求进行过滤,用于在请求之前处理资源的组件。
Filter和Listener都属于Servlet中的高级部分,Filter是最为实用的技术
。
1.2 Filter 过滤器链
请求时,从客户端到服务端顺序处理;
响应时,从服务端到客户端顺序处理。
遵从原则:先过滤,后放行。
1.3 Filter 工作原理
执行流程:
- 浏览器发起请求
- 服务器会根据这个请求,创建 request 对象及 response 对象
- 过滤器会持有 request 对象及 response 对象
- 只有当过滤器放行之后,request 对象及 response 对象才会传给 Servlet
1.4 Filter 生命周期
- 随着服务器的初始化而初始化
- 随着服务器的关闭而销毁
1.5 Filter 基本使用
开发步骤:
- 自定义类
实现 Filter 接口
- 重写
init
() doFilter
() destroy()
三个方法
- 在 web.xml 中配置过滤器:①声明过滤器 ②配置过滤器的过滤路径
创建一个过滤器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Filter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter01 过滤器的初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter01 放行之前"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("Filter01 放行之后"); } @Override public void destroy() { System.out.println("Filter01 过滤器的销毁"); } }
|
配置过滤器,使其在服务器中指定资源下生效:
1 2 3 4 5 6 7 8 9 10 11
| <filter> <filter-name>Filter01</filter-name> <filter-class>com.demo.filter.Filter01</filter-class> </filter>
<filter-mapping> <filter-name>Filter01</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
1.6 Filter 配置方式 × 2
- web.xml
<url-pattern>
标签中的匹配规则:
/
完全匹配
/开头,*结尾
目录匹配
*开头,后缀名结尾
后缀名匹配
1 2 3 4 5 6 7 8 9 10 11 12 13
| <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.demo.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
- 注解配置
@WebFilter注解
WebInitParam[] initParams() default {}; //配置初始化参数
String filterName() default “”; //配置过滤器名称
String[] servletNames() default {}; //配置过滤的Servlet
String[] urlPatterns() default {}; //配置过滤路径
1 2 3 4 5 6 7 8
| @WebFilter(filterName = "Demo04Filter" , urlPatterns = "/demo01", servletNames = "Demo01Servlet" , initParams = { @WebInitParam(name = "username",value = "root"), @WebInitParam(name = "password",value = "root123") }) public class Demo04Filter implements Filter { }
|
1.7 Filter 中文乱码处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陆</title> </head> <body> <form action="/demo/login" method="post"> 账户:<input type="text" name="username"/><br> 密码:<input type="text" name="password"/><br> 7天内自动登录:<input type="checkbox" name="autoLogin" value="logined"><br> <button type="submit">登录</button> </form> </body> </html>
|
- 方式二:使用过滤器对 request 中的服务器编码/客户端解码进行设置
(服务器初始化时会从web.xml中读取出filter的配置信息,在任何请求过程中执行Servlet前,/* 即所有的项目资源均会先被该 Filter 过滤,设置编码方式为utf-8)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.demo.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class EncodingFilter implements Filter { private String encoding = null;
@Override public void init(FilterConfig config) throws ServletException { encoding = config.getInitParameter("encoding"); }
@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { req.setCharacterEncoding(encoding); chain.doFilter(req, resp); }
@Override public void destroy() { } }
|