拦截器使用详解

33 篇文章 0 订阅
15 篇文章 0 订阅

什么是拦截器?

        拦截器是 Spring 框架提供的核⼼功能之⼀,主要⽤来拦截⽤户的请求, 在指定⽅法前后,根据业务需要执行预先设定的代码.

        也就是说,允许开发⼈员提前预定义⼀些逻辑,在请求访问接口前/后执行.也可以在⽤户请求前阻止其进入接口执行

        在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作,⽐如通过拦截器来拦截前端发来的请求,判断 Session 中是否有登录⽤户的信息.如果有就可以放⾏,如果没有就进⾏拦截.

拦截器的使用

1. 定义拦截器

        ⾃定义拦截器:实现 HandlerInterceptor 接⼝,并重写其⽅法

@Component
@Slf4j
//定义拦截器
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
         return true;
        
    }

    @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
     }
}

        如上代码,重写 preHandle() 方法,会在目标方法执行前执行,如果返回 true 就会继续执行后续操作,如果返回 false 就中断后续操作(相当于拦截了不符合要求的请求)常用于实现强制登录的效果

        重写 postHandle() 方法,会在目标方法执行后执行

2. 配置拦截器

        实现 WebMvcConfigurer 接⼝,并重写 addInterceptors ⽅法

//加上 @Configuration 注解,配置才会生效
@Configuration
//项目配置
public class WebConfig implements WebMvcConfigurer {
    //登录拦截器
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/User/login");
    }
}

        registry 对象调用 addInterceptor() 方法来添加拦截器,

        调用 addPathPatterns() 来设置拦截器要拦截哪些请求,

        调用 excludePathPatterns 来设置拦截器不拦截哪些请求

        在上述代码中 /** 表示要拦截所有的请求, /User/login 表示不拦截该网络路径的请求

常见的拦截路径设置

        以上拦截规则可以拦截此项⽬中指定的 URL ,包括静态⽂件(图⽚⽂件, JS 和 CSS 等⽂件).

我们可以通过如下的代码,不拦截对前端静态资源的访问,拦截对后端接口的访问

@Configuration
public class WebConfig implements WebMvcConfigurer {
 //⾃定义的拦截器对象 
 @Autowired
 private LoginInterceptor loginInterceptor;

 private List<String> excludePaths = Arrays.asList(
         "/user/login",
         "/**/*.js",
         "/**/*.css",
         "/**/*.png",
         "/**/*.html"
 );
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
     //注册⾃定义拦截器对象 
     registry.addInterceptor(loginInterceptor)
         .addPathPatterns("/**")//设置拦截器拦截的请求路径(/** 表⽰拦截所有请求)
         .excludePathPatterns(excludePaths);//设置拦截器排除拦截的路径 
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值