过滤器和拦截器都是AOP思想的实现
过滤器是基于函数回调,拦截器是基于动态代理(反射机制)
image.png

Filter过滤器:

filter是springMVC三大组件(Servlet,Filter,Listener)之一

  1. @WebFilter("/*")
  2. public class FilterDemo implements Filter {
  3. @Override
  4. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  5. //1. 放行前,对 request数据进行处理
  6. System.out.println("1.FilterDemo...");
  7. //放行
  8. chain.doFilter(request,response);
  9. //2. 放行后,对Response 数据进行处理
  10. System.out.println("3.FilterDemo...");
  11. }
  12. @Override
  13. public void init(FilterConfig filterConfig) throws ServletException {
  14. }
  15. @Override
  16. public void destroy() {
  17. }
  18. }

Filter的拦截路径有如下四种配置方式:

  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
  • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
  • 拦截所有:/*:访问所有资源,都会被拦截

    1. @WebFilter("/*")
    2. public class LoginFilter implements Filter {
    3. @Override
    4. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    5. HttpServletRequest req = (HttpServletRequest) request;
    6. //判断访问资源路径是否和登录注册相关
    7. //1,在数组中存储登陆和注册相关的资源路径
    8. String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
    9. //2,获取当前访问的资源路径
    10. String url = req.getRequestURL().toString();
    11. //3,遍历数组,获取到每一个需要放行的资源路径
    12. for (String u : urls) {
    13. //4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
    14. /*
    15. 比如当前访问的资源路径是 /brand-demo/login.jsp
    16. 而字符串 /brand-demo/login.jsp 包含了 字符串 /login.jsp ,所以这个字符串就需要放行
    17. */
    18. if(url.contains(u)){
    19. //找到了,放行
    20. chain.doFilter(request, response);
    21. //break;
    22. return;
    23. }
    24. }
    25. //1. 判断session中是否有user
    26. HttpSession session = req.getSession();
    27. Object user = session.getAttribute("user");
    28. //2. 判断user是否为null
    29. if(user != null){
    30. // 登录过了
    31. //放行
    32. chain.doFilter(request, response);
    33. }else {
    34. // 没有登陆,存储提示信息,跳转到登录页面
    35. req.setAttribute("login_msg","您尚未登陆!");
    36. req.getRequestDispatcher("/login.jsp").forward(req,response);
    37. }
    38. }
    39. public void init(FilterConfig config) throws ServletException {
    40. }
    41. public void destroy() {
    42. }
    43. }

    一般Filter都会有之前之后的逻辑,他执行在servlet之前,也就是用户访问接口(url)之前
    常用于登录判断。
    image.png

    Interceptor拦截器

    他是Spring提供的
    可以在servlet之后的某个方法或类执行前拦截,类似过滤器
    基本上过滤器可以做的,拦截器都可以完成
    具体:日志、登录判断、统一异常处理等等
    案例地址链接:https://blog.csdn.net/weixin_43145299/article/details/121530576

    区别

    过滤器和拦截器的区别
    ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
    ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
    ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
    ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。
    原文链接:https://blog.csdn.net/qq_42924666/article/details/109563400