拦截器没有生效
来源:9-12 后端接口增加登录校验

我还年轻吃苦趁现在
2022-09-04
@Component public class LoginInterceptor implements HandlerInterceptor { private static final Logger LOG = LoggerFactory.getLogger(LoginInterceptor.class); @Resource private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 打印请求信息 LOG.info("------------- LoginInterceptor 开始 -------------"); long startTime = System.currentTimeMillis(); request.setAttribute("requestStartTime", startTime); // OPTIONS请求不做校验, // 前后端分离的架构, 前端会发一个OPTIONS请求先做预检, 对预检请求不做校验 if(request.getMethod().toUpperCase().equals("OPTIONS")){ return true; } String path = request.getRequestURL().toString(); LOG.info("接口登录拦截:,path:{}", path); //获取header的token参数 String token = request.getHeader("token"); LOG.info("登录校验开始,token:{}", token); if (token == null || token.isEmpty()) { LOG.info( "token为空,请求被拦截" ); response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } Object object = redisTemplate.opsForValue().get(token); if (object == null) { LOG.warn( "token无效,请求被拦截" ); response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } else { LOG.info("已登录:{}", object); return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { long startTime = (Long) request.getAttribute("requestStartTime"); LOG.info("------------- LoginInterceptor 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // LOG.info("LogInterceptor 结束"); } }
public class SpringMvcConfig implements WebMvcConfigurer { @Resource LoginInterceptor loginInterceptor; public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns( "/test/**", "/redis/**", "/user/login", "/category/all", "/ebook/list", "/doc/all/**", "/doc/vote/**", "/doc/find-content/**" ); } }
写回答
1回答
-
我还年轻吃苦趁现在
提问者
2022-09-04
解决了。多个配置类都实现了
WebMvcConfigurer。导致后只会有一个生效,解决办法是,将这些配置都在一个类中设置,即将代码整合至一个类中
@Configuration public class SpringMvcConfig implements WebMvcConfigurer { @Resource LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 配置LoginInterceptor拦截器 registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") // 所有路径被拦截 .excludePathPatterns( //添加不拦截路径 "/test/**", "/redis/**", "/user/login", "/category/all", "/ebook/list", "/doc/all/**", "/doc/vote/**", "/doc/find-content/**" ); } /** * 解决跨域类 */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //地址的请求地址 .allowedOriginPatterns("*") //允许来源 .allowedHeaders(CorsConfiguration.ALL) .allowedMethods(CorsConfiguration.ALL) .allowCredentials(true) //凭证 .maxAge(3600); // 1小时内不需要再预检(发OPTIONS请求) } @Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); return objectMapper; } }
20
相似问题