过滤器
2019-03-19 本文已影响0人
旦暮何枯
过滤器 Filter
用于对用户请求进行预处理,和对请求响应进行后处理的 web 应用组件。
过滤源:请求与响应
过滤规则:自定义过滤规则
过滤器工作原理
image.png过滤器的应用场景
- 用户认证
- 编解码处理
- 请求数据压缩处理
过滤器生命周期
过滤器的生成和销毁由 servlet 容器负责。
1.web-app 启动时,根据部署描述符的设置,创建 过滤器的实例对象,进行初始化。
在部署描述符中(web.xml),可对 filter 进行配置。 <filter-config>
2.过滤操作, dofilter 方法;
- web-app 被移除,或服务器被停用;执行 destroy 方法。
过滤器的创建
新建类继承 Filter 类,实现 Filter 类的 init, doFilter, destroy 方法。
过滤器的创建和 servlet 差不多;都需要在 部署描述符(web.xml)中进行注册,配置:
web.xml 注册 filter
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>FilterTest</filter-class>
<init-param>
<param-name>filterParam</param-name>
<param-value>111</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/hello/world/*</url-pattern>
</filter-mapping>
java 创建 Filter 类:
该 Filter 的作用是检查用户是否已经登录;若登录,跳转到 /hello/world 目录下
否则跳转 index.html 页面
public class FilterTest implements Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
System.out.println("filter doFilter method");
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = ((HttpServletRequest) req).getSession();
if (session.getAttribute("userName") == null ){
HttpServletResponse response = (HttpServletResponse) resp;
response.sendRedirect("../index.html");
} else {
chain.doFilter(req,resp);
}
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
System.out.println("filter init method");
String value = config.getInitParameter("filterParam");
System.out.println("filter config param: " + value);
}
}
过滤器链
由多个过滤器组成。
请求按照在部署描述符中注册的先后顺序进行请求的过滤。
1.当第一个过滤器的 doFilter 方法被调用的时候,servlet 容器创建一个代表 filter链的 filterChain 对象传递给该方法。
2.在 doFilter 方法中如果开发调用了 filterChain 中的 doFilter 方法,servlet 容器会检查 filterchain 中是否还存在其他的 filter;若存在,继续调用 filter 方法;
3.若不存在其他的 filter, servlet 会调用对应的目标资源;即最后一个 filter 方法请求的 servlet 资源对象。