导入包:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建几个类
JwtInterceptor类:
@Component
public class JwtInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(JwtInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
logger.error("-------------->未传入Authorization------------------------------------------》");
return false;
}
try {
token = token.replace("Bearer ", "");
Claims claims = JwtUtil.validateToken(token);
request.setAttribute("claims", claims);
Integer userId = Integer.parseInt(claims.get("userId").toString());
return true;
} catch (Exception e) {
logger.error("--->token错误,无法获取到用户信息----");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
创建WebConfig1(如有多个则可以用其他名称):
@Configuration
public class WebConfig1 implements WebMvcConfigurer {
@Autowired
private JwtInterceptor jwtInterceptor;
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
@Override
public void addFormatters(FormatterRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/client/login/wx-login")
.excludePathPatterns("/v3/**")
.excludePathPatterns("/ali/**")
.excludePathPatterns("/assist/**")
.excludePathPatterns("/rufund/**")
.excludePathPatterns("/api/100/**")
.excludePathPatterns("/api/rotation/getRotation")
.excludePathPatterns("/bindStore/getAutoStoreInfo")
.excludePathPatterns("/bindStore/savaUserExceptionInfo")
.excludePathPatterns("/client/food/search-food")
.excludePathPatterns("/api/nav/getNavigationFoodList")
.excludePathPatterns("/api/basket/getNum")
.excludePathPatterns("/api/rotation/getOrderTime")
.excludePathPatterns("/link/getShareLink")
.excludePathPatterns("/client/food/category-listXiaoCaiApp")
.excludePathPatterns("/client/login/isOpen")
.excludePathPatterns("/proOrder/getProductCateGory")
.excludePathPatterns("/proOrder/getProductList")
.excludePathPatterns("/detail/getTmp")
.excludePathPatterns("/client/login/bindPhone")
.excludePathPatterns("/recharge/getRechargeList")
.excludePathPatterns("/api/center/couponCenterList")
.excludePathPatterns("/link/getIsTurn")
.excludePathPatterns("/bindStore/getStoreName")
.excludePathPatterns("/link/getLinkIsLose")
.excludePathPatterns("/fuli/order/getLinkIdIsLose")
.excludePathPatterns("/fuli/order/getLinkShareInfo")
; // 排除登录接口
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
@Override
public void addCorsMappings(CorsRegistry registry) {
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
@Override
public Validator getValidator() {
return null;
}
@Override
public MessageCodesResolver getMessageCodesResolver() {
return null;
}
}
-------------------------------以上写在controller层---------------------------------------
工具类JwtUtil:
public class JwtUtil {
private static final String SECRET_KEY = "yl001"; // 签名密钥
private static final long EXPIRATION_TIME = 3600000; // 1 小时(单位:毫秒)
/**
* 生成 JWT Token
*
* @param claims 自定义的负载(如用户信息)
* @return JWT 字符串
*/
public static String generateToken(Map<String, Object> claims) {
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date()) // 签发时间
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
.signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 签名算法
.compact();
}
/**
* 验证 Token 并解析
*
* @param token JWT 字符串
* @return 解析后的 Claims
*/
public static Claims validateToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
}
/**
* 检查 Token 是否过期
*
* @param claims JWT 的 Claims
* @return 是否过期
*/
public static boolean isTokenExpired(Claims claims) {
return claims.getExpiration().before(new Date());
}
}
登录使用:
Map<String, Object> claims = new HashMap<>();
claims.put("userId", user.getId());
String token = JwtUtil.generateToken(claims);
解析:
通用方法:
public static Integer getTokenUserId(HttpServletRequest request){
Integer userId = null;
try {
Object claims = request.getAttribute("claims");
Gson gson = new Gson();
String s = gson.toJson(claims);
JSONObject jsonObject = JSONObject.parseObject(s);
userId = jsonObject.getInteger("userId");
} catch (Exception e) {
e.printStackTrace();
log.error("----------获取token用户id失败-------");
}
return userId;
}
//在请求参数上加 HttpServletRequest request
userId = CommonToken.getTokenUserId(request);