token 验证拦截器
每个项目初始时最先有的就是登陆登出功能,随着业务逻辑增多接口慢慢的变的也很多,这个时候就需要在请求的接口的时候验证token是否是登陆人所请求,从而避免一部分被恶意攻击的可能,但是很多人接手的项目很大可能上都是已经做完了登陆验证token的这一步,直接做业务代码。很少有接触0到1的项目。所以今天就记录一下我目前做0到1项目中token拦截器验证token有效的步骤,学习笔记仅供学习使用只记录思路,具体逻辑根据自己项目要求编写。废话不多说,直接贴代码。
第一步:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* @author xx
*/
@Configuration
public class AdminWebMvcConfig implements WebMvcConfigurer {
@Resource
private TokenVerifyHandle tokenVerifyHandle;
//放行路径
private static final String[] EXCLUDE_PATH_PATTERNS = {
// Swagger
"**/swagger-ui.html",
"/swagger-resources/**",
"/webjars/**",
"/v2/**",
"/swagger-ui.html/**",
"/doc.html/**",
"/error",
"/favicon.ico",
"sso/auth",
"/csrf",
"/getUserByCode/**",
"/refreshToken/**"
};
/**
* 自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenVerifyHandle)
.addPathPatterns("/**")
.excludePathPatterns(EXCLUDE_PATH_PATTERNS)
.excludePathPatterns("/login");
}
}
第二部:
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* 自定义拦截器
*/
@Component
public class TokenVerifyHandle implements HandlerInterceptor {
@Resource
private RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// String path = request.getServletPath();
String token = request.getHeader(GlobalConstant.TOKEN);
// 验证token
verifyToken(token);
// //刷新token有效时间
// boolean expire = redisService.expire(token, 15L, TimeUnit.MINUTES);
// if(!expire){
// return false;
// }
return true;
}
/**
* 验证token
* @param token token
*/
private void verifyToken(String token) {
if(token == null){
throw new RuntimeException("未登陆,请先登陆!");
}
Object object = redisService.getCacheObject(GlobalConstant.TOKEN + ":" + token);
if(Objects.isNull(object)){
throw new RuntimeException("token已失效,请重新登陆!");
}
}
}
说明:其中redisService为自己封住装备的redis的工具类,方便操作redis的存储和取值。
GlobalConstant:为自定义的常量类,其为存储token的key。可自定义
次代码仅为思路,具体实现要根据项目要求来定义。
仅为学习笔记,学习笔记,学习笔记!!!