过滤器过滤器Filter(注意:过滤器,servlet执行的顺序)、FilterChain过滤链
原创
©著作权归作者所有:来自51CTO博客作者Denial_learn的原创作品,请联系作者获取转载授权,否则将追究法律责任
Filter的作用:
当用户的请求到达指定的URL之前,可以借助Filter来改变这些请求的内容;同样地,当响应结果到达客户端之前,可以使用Filter修改输出的内容。
什么是FilterChain(过滤器链):
一个FilterChain包含多个Filter。
过滤器的工作原理:
过滤器的部署(web.xml):
<!--配置过滤器-->
<filter>
<filter-name>checkSessionFilter</filter-name>
<filter-class>com.DVD.Filter.checkSessionFilter</filter-class>
</filter>
<!--映射过滤器-->
<filter-mapping>
<filter-name>checkSessionFilter</filter-name>//过滤器的名字
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/admin/*</url-pattern>//过滤器的路径(要过滤哪一个)
</filter-mapping>
具体的实现:
- 实现Filter接口:过滤器是一个对象,它根据用户的请求和资源的响应进行过滤.
Filter接口包含以下方法:
FilterConfig:
登陆验证:
解决把登录信息放入session会产生大量重复代码的问题
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
// 从session中获取用户信息
User user = (User) session.getAttribute("user");
// 能够从session获取到用户信息,代表用户已经成功登陆过
if(user==null){
//如果获取不到用户信息,代表用户没有登陆,则转向到登陆页面
hrsq.getRequestDispatcher("/admin/Login.jsp").forward(hrsq, hsrs);
}
// 请求向下传递
chain.doFilter(request, response);
}
其中:
//设置请求字符集
request.setCharacterEncoding("GBK");
//请求向下传递
chain.doFilter(request, response);
一个页面请求进来,过滤器,servlet执行的顺序:
初始化、销毁什么的不多解释。重点说明,请求的执行顺序:
比如一个form表单,post请求:
- 过滤器中的doFilter方法(注意:这个里面只有进行请求向下传递的时候,才能进入下一个页面,否则会一致被拦截)
- 进入servlet里面的dopost方法执行完毕(包括跳转页面什么的)
- 再回到过滤器的doFilter方法,执行完毕!
FilterChain过滤链:
一个过滤器链(FilterChain),在请求到达请求资源前会依次经过链中的所有过滤器,<filter-mapping>
配置在前的Filter先执行,而请求处理完成后,会按照相反的顺序再次经过链中的所有过滤器。