1.实现HandlerInterceptor
2.重写preHandle
import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.model.domain.User;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1、获取请求头
String token = request.getHeader("Authorization");
//2、使用工具类,判断token是否有效
boolean verifyToken = JwtUtils.verifyToken(token);
//3、如果token失效,返回状态码401,拦截
if(!verifyToken) {
response.setStatus(401);
return false;
}
// 4、如果token正常可用,放行
//解析token,获取id和手机号码,构造User对象,存入Threadlocal
Claims claims = JwtUtils.getClaims(token);
String mobile = (String) claims.get("mobile");
Integer id = (Integer) claims.get("id");
User user = new User();
user.setId(Long.valueOf(id));
user.setMobile(mobile);
UserHolder.set(user);
return true;
}
//清空
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.remove();
}
}
配置拦截器:
实现WebMvcConfigurer
重写addInterceptor
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(new String[]{"/user/login","/user/loginVerification"});
}
}
工具类: 实现向ThreadLocal存储数据的方法:
public class UserHolder {
private static ThreadLocal tl = new ThreadLocal<>();
//将用户对象,存入Threadlocal
public static void set(User user) {
tl.set(user);
}
//从当前线程,获取用户对象
public static User get() {
return tl.get();
}
//从当前线程,获取用户对象的id
public static Long getUserId() {
return tl.get().getId();
}
//从当前线程,获取用户对象的手机号码
public static String getMobile() {
return tl.get().getMobile();
}
//清空
public static void remove(){
tl.remove();
}
}



