Spring Boot 拦截器无效,不起作用

5 篇文章 0 订阅
5 篇文章 0 订阅

这个问题一般是解决WebMvcConfigurerAdapter过时问题造成的。导致这个问题可能有两个原因:一个是拦截器写错了,另一个是拦截器配置错了。

1、需求是这样的

拦截所有的api请求,判断其请求头中的secret参数是否正确,正确的请求才能访问api

2、拦截器配置

需要先写拦截器,然后再配置到Spring Boot环境中。

2.1、写一个拦截器

Spring MVC中,拦截器有两种写法:要么实现HandlerInterceptor接口,要么实现WebRequestInterceptor接口,具体内容请看这里详述 Spring MVC 框架中拦截器 Interceptor 的使用方法
Spring Boot也只是集成了Spring MVC而已,所以拦截器的写法还是一样的。不一样的是Spring MVC的拦截器需要在xml文件中配置,而Spring Boot只需要在类上加@Component注解即可,这样当前拦截器才会被扫描到。
这里只需要实现HandlerInterceptor接口即可(这里没啥坑)。

/**
 * author : 颜洪毅
 * e-mail : yhyzgn@gmail.com
 * time   : 2019-08-29 17:44
 * version: 1.0.0
 * desc   : 用户拦截器
 */
@Component
public class UserInterceptor implements HandlerInterceptor {
	private static Logger log = Logger.getLogger(UserInterceptor.class);

    @Autowired
    private UserThreadLocal local;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("接收到请求");
        local.set(request.getParameter("user"));
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        local.remove();
        log.info("请求响应完成");
    }
}

2.2、将拦截器配置到Spring Boot环境中

目前(2.0.4.RELEASE版本)WebMvcConfigurerAdapter已过时,如果你执意要用的话,应该没啥坑。但是被强迫症时刻针对的人,坑就来啦。
WebMvcConfigurerAdapter过时了,那么用谁来代替呢?机智的人可能早就发现了,过时的这个只不过是个适配器(适配器模式),那就可以直接使用它所实现的那个接口啊,就是WebMvcConfigurer呗。对,就是这个,别犹豫了。。我就被百度坑得不轻,具体说说怎么被坑的吧。

  • 百度后我查到的解决方案这样的

    两种方法,并且都还强烈推荐第二种方法

// 方法一:实现WebMvcConfigurer接口
public class WebConfig implements WebMvcConfigurer{
	// ...
}

// 方法二:继承WebMvcConfigurationSupport类
public class WebConfig extends WebMvcConfigurationSupport{
	// ...
}

于是就直接用了第二种方法,写完跑了项目发现没啥效果,打日志也出不来。然后又改回第一种方法,果然,有效果了。

具体配置如下
必须加上@Configuration注解,Spring才能统一管理当前的拦截器实例。
addPathPatterns("/api/**")配置拦截路径,其中/**表示当前目录以及所有子目录(递归),/*表示当前目录,不包括子目录。

/**
 * author : 颜洪毅
 * e-mail : yhyzgn@gmail.com
 * time   : 2019-08-29 17:48
 * version: 1.0.0
 * desc   : mvc配置
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private UserInterceptor interceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 添加拦截器,配置拦截地址
        registry.addInterceptor(interceptor).addPathPatterns("/api/**");
    }
}

不出意外的话,你的拦截器应该起作用啦!

  • 30
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
在使用 JWT(JSON Web Token)进行身份验证和授权的应用程序中,可以通过配置拦截器来拦截请求并验证 JWT Token 的有效性。下面是一个示例的 JWT Token 拦截器配置: 1. 首先,创建一个拦截器类,例如 `JwtTokenInterceptor`,实现 `HandlerInterceptor` 接口。 ```java import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JwtTokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在这里编写拦截器的逻辑 // 例如,获取请求头中的 Authorization 字段,解析 JWT Token,并验证其有效性 // 如果验证失败,可以返回适当的错误响应或者重定向到登录页面 // 如果验证成功,可以继续处理请求 return true; } } ``` 2. 在 Spring Boot 的配置类中注册拦截器。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册 JwtTokenInterceptor,并指定需要拦截的路径 registry.addInterceptor(new JwtTokenInterceptor()) .addPathPatterns("/api/**"); // 拦截以 "/api" 开头的请求 } } ``` 在上述示例中,`JwtTokenInterceptor` 类实现了 `HandlerInterceptor` 接口,并重写了其中的 `preHandle` 方法。在该方法中,你可以编写验证 JWT Token 的逻辑,例如解析 Token,并判断是否有效。如果 Token 有效,返回 `true`,继续处理请求;如果无效,可以返回适当的错误响应或者重定向到登录页面。 然后,在 Spring Boot 的配置类中,通过 `addInterceptors` 方法注册 `JwtTokenInterceptor` 拦截器,并使用 `addPathPatterns` 指定需要拦截的请求路径。 请注意,上述示例仅为演示拦截器的基本配置,实际使用过程中可能需要根据你的具体需求进行相应的修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值