/** * 拦截器 * */ public class TokenInterceptor implements HandlerInterceptor { /* * 在DispatcherServlet之前执行 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//从请求头内获取tokne String token = request.getHeader("token"); if(verifyToken(token)){ log.info("token验证成功"); return true; } log.error("token验证失败"); return false; } }
@Configuration public class InterceptorConfig extends WebMvcConfigurationSupport { /** * springBoot2.0后配置拦截器需要extends 的 WebMvcConfigurerAdapter 已经过时,取而代之的是 WebMvcConfigurationSupport * WebMvcConfigurerAdapter 只是对 WebMvcCofigurer 的空实现,而WebMvcConfigurerSupport对WebMvcCofigurer的实现更全面, * 但是继承WebMvcConfigurerSupport之后SpringBoot的webMvc自动配置会失效,导致视图解析器无法解析并返回对应的视图,如果需要返回逻辑视图就继承WebMvcCofigurer * * WebMvcConfigurationSupport 在整个程序中只会生效一个,如果实现了WebMvcConfigurationSupport类,那么继承WebMvcConfigurer的类将不会生效 * * WebMvcConfigurationSupport是重写默认配置,而WebMvcConfigurerAdapter是在默认配置的上面增加扩展 * */ @Autowired private BaseAPI baseAPI; @Value("${request.whitelist}") private String whitelist;//请求白名单//配置拦截器,拦截请求验证tokne @Override protected void addInterceptors(InterceptorRegistry registry) { String[] whites = whitelist.split(","); //设置拦截的请求 //设置不拦截的请求 registry.addInterceptor(new TokenInterceptor(baseAPI)).addPathPatterns("/**").excludePathPatterns(whites); }
}
在请求中发现当执行完毕查询后又回到了拦截器中,再次回到拦截器中时就得不到header中的tokenl了,是因为有静态资源访问导致的增加配置
//增加判断过滤调静态资源访问,这样只有第一次请求会进入,之后的请求都不会进入了 if (handler instanceof ResourceHttpRequestHandler){ return true; }
完整代码
/** * token拦截器 * */ @Slf4j public class TokenInterceptor implements HandlerInterceptor { private BaseAPI baseAPI; /* * 在DispatcherServlet之前执行 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof ResourceHttpRequestHandler){ return true; } //从请求头内获取tokne String token = request.getHeader("token"); if(verifyToken(token)){ log.info("token验证成功"); return true; } log.error("token验证失败"); return false; }
}