创建自定义拦截器
@Component
@Slf4j
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 进入controller前
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("############进入用户token验证拦截器");
String uri = request.getRequestURI().toString();
log.info(uri);
String token = request.getHeader("Authorization");
if (null == token){
log.error("##########当前用户未登录");
return false;
}
String redisToken = stringRedisTemplate.opsForValue().get(CurrentUser.getUsername());
if(redisToken == null){
log.error("##########当前用户token在redis中不存在,currentUser:{}",CurrentUser.getCurrentUserDto());
return false;
}
Long expire = stringRedisTemplate.getExpire(CurrentUser.getUsername());
if(expire <= 0){
log.error("##########当前用户token已失效,currentUser:{}",CurrentUser.getCurrentUserDto());
return false;
}
//为当前登录用户重置登录活性
stringRedisTemplate.opsForValue().set(CurrentUser.getUsername(),token,60*60*24, TimeUnit.SECONDS);
return true;
}
}
接着创建配置类,来启用自定义的拦截器
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
@Autowired
LoginInterceptor loginInterceptor;
/**
* 解决跨域请求问题
*
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
/**
* 添加token拦截器
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
//选择过滤哪些接口
.addPathPatterns("/**")
//选择忽略的接口
.excludePathPatterns("/user/login");
super.addInterceptors(registry);
}
}
出现的问题:
一、创建了配置类,并添加了自定义的拦截器,但仍未生效
原因可能是因为创建了多个继承“WebMvcConfigurationSupport ”的配置类,跨域的配置类也是继承这个类,所以他们两个中会有一个未生效
深入了解
HandlerInterceptorAdapter和HandlerInterceptor
HandlerInterceptorAdapter是HandlerInterceptor的抽象实现类,两者无太大差别,除了一个需要实现一个需要继承外
WebMvcConfigurationSupport和WebMvcConfigurer和WebMvcConfigurerAdapter
区别是当继承WebMvcConfigurationSupport时会覆盖原配置,而WebMvcConfigurer是自定义配置
WebMvcConfigurerAdapter是WebMvcConfigurer的一个抽象实现类,5.0后WebMvcConfigurer内部有默认的实现方法,已启用
@deprecated as of 5.0 {@link WebMvcConfigurer} has default methods (made
possible by a Java 8 baseline) and can be implemented directly without the
need for this adapter