代码是配置拦截器拦截规则,一般写在具体项目的config中
@Configuration
@Slf4j
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//设置拦截器
registry.addInterceptor(new LoginInterceptor())
//添加拦截路径/*/表示可变 /**表示后面全统配
.addPathPatterns("/api/account/*/**"")
//排除拦截路径
.excludePathPatterns("");
}
}
LoginInterceptor 是自己编写的拦截器规则,一般写在common中
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
//设置线程变量,方便方法透穿
public static ThreadLocal<LoginUser> threadLocal=new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//放行Options请求
if(HttpMethod.OPTIONS.toString().equalsIgnoreCase(request.getMethod())){
response.setStatus(HttpStatus.NO_CONTENT.value());
return true;
}
//从头部拿到token
String accessToken=request.getHeader("token");
if(StringUtils.isBlank(accessToken)){
//头部没有看看参数有没有
accessToken=request.getParameter("token");
}
if(StringUtils.isNotBlank(accessToken)){
//解析JWT
Claims claims = JWTUtil.checkJWT(accessToken);
if(claims==null){
//未登录,或者说已经过期
CommonUtil.sendJsonMessage(response, JsonData.buildResult(BizCodeEnum.ACCOUNT_UNLOGIN));
return false;
}
//拟构 loginUser
long accuntNo = Long.parseLong(claims.get("accunt_no").toString());
String headImg=claims.get("head_img").toString();
String username=claims.get("username").toString();
String mail=claims.get("mail").toString();
String phone=claims.get("phone").toString();
String auth=claims.get("auth").toString();
LoginUser loginUser = LoginUser.builder()
.accountNo(accuntNo)
.headImg(headImg)
.username(username)
.mail(mail)
.phone(phone)
.auth(auth)
.build();
//透传方式1通过Attribute
//request.setAttribute("loginUser",loginUser);
//透传方式2通过ThreadLocal
threadLocal.set(loginUser);
return true;
}
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//删除线程变量,以免内存溢出
threadLocal.remove();
}
}