Interceptor 拦截器

1、拦截器的介绍

  • 拦截器使用场景:
  1. 登录验证:对于需要登录才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面。
  2. 权限校验:根据用户权限对部分网址进行访问控制,拒绝未经授权的用户访问。
  3. 请求日志:记录请求信息,例如请求地址、请求参数、请求时间等,用于排查问题和性能优化。
  4. 更改响应:可以对响应的内容进行修改,例如添加头信息、调整响应内容格式等。
  • 拦截器和过滤器的简单区别:
  1. 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,例如设置编码和字符集、请求头、状态码等。
  2. 拦截器则更加侧重于对控制器进行前置或后置处理,在请求到达控制器之前或之后进行特定的操作,例如打印日志、权限验证等。

2、拦截器的实现

实现拦截器需要实现HandlerInterceptor接口,并且重写preHandlepostHandleafterCompletion,事实上即使不重写也是没问题的。该方法实际上有默认实现。其中preHandle需要一个boolean的返回值。如果返回值true,程序放行。

package com.powernode.Interceptors;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class MyInterceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1 preHandle 执行.......");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1 postHandle 执行.......");
    }

    @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1 afterCompletion 执行.......");
    }
}

然后我们需要在SpringMVC框架的配置文件,对拦截器进行配置。有两钟方式。

方式一:

  <!--配置拦截器-->
    <mvc:interceptors>
        <bean class="com.powernode.Interceptors.MyInterceptor1"></bean>
    </mvc:interceptors>

方式二:
我的拦截器类名是MyInterceptor1,在这里我们需要把首字母小写。

   <mvc:interceptors>
        <ref bean="myInterceptor1"></ref>
    </mvc:interceptors>

测试:

3、拦截器的高级配置

设置拦截器拦截路径:

    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截所有路径-->
            <mvc:mapping path="/**"/>
            <!--除 /test 路径之外-->
            <mvc:exclude-mapping path="/test"/>
            <!--拦截器-->
            <ref bean="myInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>

4、多个拦截器执行顺序

Filter、Servlet、Interceptor、Controller的执行顺序:

设置多个拦截器

    <mvc:interceptors>
        <ref bean="myInterceptor2"></ref>
        <ref bean="myInterceptor3"></ref>
        <ref bean="myInterceptor1"></ref>
    </mvc:interceptors>

如果所有拦截器的 preHandle都返回truepreHandle按照排布顺序执行。 postHandleafterCompletion按照和排布顺序相反顺序执行。

只要有一个拦截器preHandle返回false,任何postHandle都不执行。但返回false的拦截器的前面的拦截器按照逆序执行afterCompletion
现在拦截器按照顺序排布,同时让拦截器2的preHandle返回false

posted @ 2024-07-12 18:37  BLBALDMAN  阅读(2)  评论(0编辑  收藏  举报