Filter
Filter
Servlet, Filter, Listener称为Java Web的三大组件
Filter: 过滤器
当浏览器访问服务器资源时和响应返回时,过滤器可以将请求拦截下来,完成一些特殊功能
用途: 一般用于完成通用操作:如登录验证,统一编码处理,敏感字符过滤…
1. Filter实现
- 定义一个类,实现Filter接口
- 覆写方法
- 配置拦截路径
- 配置WEB-INF中的xml
- 用注解配置路径:@WebFilter(urlPatterns=””)或@WebFilter(value=””)或@WebFilter(””)
2. Filter原理
- Filter执行流程
- 请求过滤:执行放行doFilter上的代码
- 放行:执行doFilter,拦截的资源被执行
- 响应过滤:拦截的资源做出响应后,回来执行doFilter下边的代码
- Filter生命周期
- init():初始化
在服务器启动后,创建Filter对象,执行init方法。
只执行一次。一般用于加载资源。
- doFilter():请求过滤,响应过滤。
- destroy():销毁
在服务器正常关闭时调用,一般用于释放资源
- init():初始化
- 过滤器拦截路径
- 拦截资源:/index.jsp, /loginServlet
只有访问具体资源时,过滤器才会被执行
2. 拦截目录:/user/*
只有访问/user下的资源时,过滤器才会被执行
3. 后缀名拦截:*.jsp (没有/)
4. 拦截所有资源:/*
- 过滤器的拦截方式:资源的访问方式
- 注解配置:配置dispatcherType属性
- REQUEST: 默认值,资源被浏览器直接访问时,才被拦截
- FORWARD: 转发访问这个资源时,才被拦截
- INCLUDE:包含访问资源时,才被拦截
- ASYNC:异步访问资源时,才被拦截
@WebFilter(dispatcherType={DispatcherType.REQUEST, DispatcherType.FORWARD});
2. xml配置
- 拦截链
- 执行顺序:请求过滤按先后顺序由小到大执行,响应顺序则正好相反
All filter... (@WebFilter(/*))
hello Filter... (@WebFilter(/hello.jsp))
你好,JSP (hello.jsp)
hello Filter back...
All filter…
2. 过滤器的先后顺序
* 注解配置:- 按字符串比较规则,由小到大执行。
如:/*先于/login.jsp执行
- 如果有重复,则从小到大覆盖执行
如:/* 和 /login.jsp在请求login.js时都执行过滤
* web.xml配置:谁在上,谁先执行
- 登录案例
- 访问案例的资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
@WebFilter("/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest request1=(HttpServletRequest) request; String uri=request1.getRequestURI(); //注意:要过滤资源,否则样式和字体等login的资源不显示 if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/js/") || uri.contains("/checkCodeServlet")) { chain.doFilter(request, response); } else { String userName= (String) request1.getSession().getAttribute("username"); if(null != userName && !"".equals(userName)) { chain.doFilter(request, response); }else { request.setAttribute("loginMsg","您未登录,请登录!"); request.getRequestDispatcher("/hellouser/login.jsp").forward(request, response); } } } }