知方号

知方号

SpringBoot配置拦截器HandlerInterceptor注入redis为空解决方案

SpringBoot配置拦截器HandlerInterceptor注入redis为空解决方案

小编在开发中,需要在拦截器中使用redis,做请求验证,但是注入之后的redis一直为空,通过查阅资料发现,SpringBoot拦截器实在Bean实例化前执行的,而redis是在实例化后才会在堆中存在,因为加载阶段不一致,所以导致注入的redis为空,那么问题分析完毕,这时只需要将拦截器实例化,这时拦截器与redis都是在初始化阶段执行了,然后将初始化后的拦截器注册到Spring中即可。

下方为拦截器代码:

public class MyInterceptor implements HandlerInterceptor { @Autowired private RedisTemplate redisTemplate; /** * 拦截请求配置 * * @param request * @param response * @param handler * @return boolean * @date 2023/7/22 11:14 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String tokenHandler = request.getHeader("Login-Token"); if (!StringUtils.isEmpty(tokenHandler)) { Map stringObjectMap = JwtTokenUtils.tokenParse(tokenHandler); String account = (String) stringObjectMap.get("account"); String tokenRedis = (String) redisTemplate.opsForValue().get("login:handler:token:" + account); if (!StringUtils.isEmpty(tokenRedis)) { if (tokenRedis.equals(tokenRedis)) { return true; } } } responseError(response,"令牌为空"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle ——> 执行了"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion ——> 执行了"); } // 非法请求跳转 private void responseError(ServletResponse response, String msg) { HttpServletResponse httpServletResponse = (HttpServletResponse) response; try { // msg封装为get请求的请求参数,即拼接在url后面,对于中文信息需要进行utf-8编码 msg = URLEncoder.encode(msg, String.valueOf(StandardCharsets.UTF_8)); // 跳转至控制器unauthorized httpServletResponse.sendRedirect("/api/operate/unauthorized/" + msg); } catch (IOException e) { System.out.println(e.getMessage()); } }}

接下来将拦截器注册到spring中,注册前先将我们的拦截器实例化,看最后一个方法:

@Configuration@MapperScan(basePackages = {"com.xiaowu.operate.mapper"})@ComponentScan(basePackages = {"com.xiaowu.config"})public class OperateConfig implements WebMvcConfigurer { /** * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); // 针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; } /** * 实例化拦截器 * @author zhangXiaoPeng * @date 2023/7/22 16:00 * @return com.xiaowu.operate.config.MyInterceptor */ @Bean public MyInterceptor getInterceptor(){ return new MyInterceptor(); }}

这时已经将拦截器初始化了,然后将这个初始化后的拦截器注册到Spring中:

/** * 注册到spring中拦截器 * @author zhangXiaoPeng * @date 2023/7/22 11:03 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(getInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/api/operate/log/userOperateDetailInsert"); }

这时问题得到解决。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了