springboot中拦截器配置使用

前置

你使用

  • java
  • springboot

常用在:

  • 身份验证与授权,使用拦截器检查用户的身份验证状态和权限级别,确保只有经过验证且有适当权限的用户能够访问特定资源
  • 日志记录与审计
  • 性能分析与监控,拦截器可用于测量请求处理时间,收集性能指标,识别潜在的性能瓶颈
  • 跨域资源共享(CORS)配置,通过拦截器设置适当的HTTP响应头来允许或限制跨域请求

过滤器和拦截器非常相似,但是它们有很大的区别,简单明了的区别就是:

  • 过滤器可以修改request,而拦截器不能
  • 拦截器可以调用IOC容器中的各种依赖,而过滤器不能
  • 过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

拦截器代码

@Component
public class FirstInterceptor implements HandlerInterceptor {
    //调用目标方法之前执行的方法
    //如果返回ture表示拦截器验证成功,执行目标方法
    //如果返回false表示拦截器验证失败,不再继续执行后续业务
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        // 从 session 中获取用户信息
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            // 未登录,返回 401 错误
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "请先登录");
            return false; // 中断请求
        }
        System.out.println("FirstInterceptor: 用户已登录,放行请求");
        return true; // 放行请求
    }

	// 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    	// ...
    }

	// 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    	// ...
    }
}

拦截器注册

@Configuration
public class MyConfig implements WebMvcConfigurer {

    //注入
    @Autowired
    private FirstInterceptor firstInterceptor;

    //将拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(firstInterceptor)
                .addPathPatterns("/**") //拦截所有的 url
                .excludePathPatterns("/user/login")//排除url: /user/login (登录)
                .excludePathPatterns("/user/reg") //排除url: /user/reg   (注册)
                .excludePathPatterns("/image/**")//排除 image(图像) 文件夹下的所有文件
                .excludePathPatterns("/**/*.js")//排除任意深度目录下的所有".js"文件
                .excludePathPatterns("/**/*.css");
    }
}

为什么没有标记 @Bean?方法是怎么被执行的?
Spring Boot 在启动时会自动扫描所有实现了 WebMvcConfigurer 接口的配置类,并调用其方法(如 addInterceptors)。Spring MVC 会通过反射调用 addInterceptors 方法,将拦截器注册到 Spring MVC 的处理链中

疑问

多个拦截器,执行顺序怎么配置?
Spring Boot 的拦截器顺序由 InterceptorRegistry.order() 控制,@Order 注解不会生效

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthInterceptor authInterceptor;

    @Autowired
    private LogInterceptor logInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 权限验证拦截器(优先级最高)
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/**")
                .order(1); // 数值越小优先级越高

        // 日志记录拦截器(优先级次高)
        registry.addInterceptor(logInterceptor)
                .addPathPatterns("/**")
                .order(2); // 数值越大优先级越低
    }
}

preHandle() 执行顺序,先注册先执行;
postHandle() 和 afterCompletion() 执行顺序,先注册确后执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

abcnull

您的打赏是我创作的动力之一

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

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

打赏作者

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

抵扣说明:

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

余额充值