前置内容:
1、 Filter快速入门
-
使用步骤
- 定义类并实现Filter接口
- 定义@WebFilter注解,配置拦截路径
- 放行
- (请求其他资源)
-
Demo
package priv.dandelion.controller.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class FilterDemo 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("FilterDemo..."); // 放行 filterChain.doFilter(servletRequest, servletResponse); // 放行后逻辑 } @Override public void destroy() { } }
2、 Filter执行流程
- 浏览器发送请求到服务器
- Filter拦截请求
- 执行放行前逻辑
- 放行请求
- 访问对应资源
- 执行放行后逻辑
- 服务器对浏览器做出响应
3、 Filter使用细节
-
拦截路径配置
- 拦截具体资源:
/index.jsp
- 目录拦截:
/user/*
- 后缀名拦截:
*.jsp
- 拦截所有:
/*
- 拦截具体资源:
-
过滤器链
-
一个Web应用可以配置多个过滤器,多个过滤器成为过滤器链
- 多个过滤器逐一放行
- 请求资源
- 按照递归顺序执行过滤器链的放行后逻辑
-
过滤器链的过滤顺序
- 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
- 可在XML中配置顺序
-
4、 案例
-
需求
- 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面
-
方式
- 判断请求资源是否和登录注册相关,若是则放行
- 判断Session中是否有User对象,若有则放行,否则跳转到登录
-
环境准备
环境和案例框架见:用户登录注册案例
-
代码实现
package priv.dandelion.controller.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @WebFilter("/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; // 判断访问的资源是否和登录注册相关 String[] urls = {"/login.jsp", "/register.jsp", "/imgs/", "/css/", "/login", "/register", "/checkCode"}; // 获取当前访问资源的路径 String requestURL = req.getRequestURL().toString(); for (String url : urls) { if (requestURL.contains(url)) { // 若为和登录注册相关的资源,则放行并直接结束过滤器执行 System.out.println(url); filterChain.doFilter(req, servletResponse); return; } } // 判断Session中是否有user // 获取Session Object user = req.getSession().getAttribute("user"); if (user != null) { // 放行 System.out.println("已登录,放行"+ user); filterChain.doFilter(servletRequest, servletResponse); } else { // 存储提示信息,拦截跳转到登录页面 System.out.println("未登录,将跳转到登录页面"); req.setAttribute("login_msg", "您尚未登录!"); req.getRequestDispatcher("/login.jsp").forward(req, servletResponse); } } @Override public void destroy() { } }