太仓智能网站建设,教育网站怎么做引导栏的,电商设计模板,做网站公奇闻司郑州汉狮全局token验证
简介
通俗地说#xff0c;JWT的本质就是一个字符串#xff0c;它是将用户信息保存到一个Json字符串中#xff0c;然后进行编码后得到一个JWT token#xff0c;并且这个JWT token带有签名信息#xff0c;接收后可以校验是否被篡改#xff0c;所以可以用…全局token验证
简介
通俗地说JWT的本质就是一个字符串它是将用户信息保存到一个Json字符串中然后进行编码后得到一个JWT token并且这个JWT token带有签名信息接收后可以校验是否被篡改所以可以用于在各方之间安全地将信息作为Json对象传输。JWT的认证流程如下
前端通过Web表单将自己的用户名和密码发送到后端的接口这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS)从而避免敏感信息被嗅探
后端核对用户名和密码成功后将包含用户信息的数据作为JWT的Payload将其与JWT Header分别进行Base64编码拼接后签名形成一个JWT Token形成的JWT Token就是一个如同lll.zzz.xxx的字符串
由一下可以实现全局的token验证无需再其余地方进行验证token。
jwt实现
public class AppJwtUtil {// TOKEN的有效期一天Sprivate static final int TOKEN_TIME_OUT 3_600;// 加密KEYprivate static final String TOKEN_ENCRY_KEY MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY;// 最小刷新间隔(S)private static final int REFRESH_TIME 300;// 生产IDpublic static String getToken(Long id){MapString, Object claimMaps new HashMap();claimMaps.put(id,id);long currentTime System.currentTimeMillis();return Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new Date(currentTime)) //签发时间.setSubject(short-chain) //说明.setIssuer(zh) //签发者信息.setAudience(app) //接收用户.compressWith(CompressionCodecs.GZIP) //数据压缩方式.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式.setExpiration(new Date(currentTime TOKEN_TIME_OUT * 1000)) //过期时间戳.addClaims(claimMaps) //cla信息.compact();}//临时tokenpublic static String getToken( ){MapString, Object claimMaps new HashMap();long currentTime System.currentTimeMillis();return Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new Date(currentTime)) //签发时间.setSubject(short-chain) //说明.setIssuer(zh) //签发者信息.setAudience(app) //接收用户.compressWith(CompressionCodecs.GZIP) //数据压缩方式.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式.setExpiration(new Date(currentTime TOKEN_TIME_OUT/60 )) //过期时间戳.addClaims(claimMaps) //cla信息.compact();}public static String getAppkey( ){MapString, Object claimMaps new HashMap();long currentTime System.currentTimeMillis();return Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new Date(currentTime)) //签发时间.setSubject(short-chain) //说明.setIssuer(zh) //签发者信息.setAudience(app) //接收用户.compressWith(CompressionCodecs.GZIP) //数据压缩方式.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式.setExpiration(new Date(currentTime TOKEN_TIME_OUT*60000000000L )) //过期时间戳.addClaims(claimMaps) //cla信息.compact();}/*** 获取token中的claims信息** param token* return*/private static JwsClaims getJws(String token) {return Jwts.parser().setSigningKey(generalKey()).parseClaimsJws(token);}/*** 获取payload body信息** param token* return*/public static Claims getClaimsBody(String token) {try {return getJws(token).getBody();}catch (ExpiredJwtException e){return null;}}/*** 获取hearder body信息** param token* return*/public static JwsHeader getHeaderBody(String token) {return getJws(token).getHeader();}/*** 是否过期** param claims* return -1有效0有效1过期2过期*/public static int verifyToken(Claims claims) {if(claimsnull){return 1;}try {claims.getExpiration().before(new Date());// 需要自动刷新TOKENif((claims.getExpiration().getTime()-System.currentTimeMillis())REFRESH_TIME*1000){return -1;}else {return 0;}} catch (ExpiredJwtException ex) {return 1;}catch (Exception e){return 2;}}/*** 由字符串生成加密key** return*/public static SecretKey generalKey() {byte[] encodedKey Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());SecretKey key new SecretKeySpec(encodedKey, 0, encodedKey.length, AES);return key;}public static void main(String[] args) {/* Map map new HashMap();map.put(id,11);*/System.out.println(AppJwtUtil.getToken(1102L));JwsClaims jws AppJwtUtil.getJws(eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA);Claims claims jws.getBody();System.out.println(claims.get(id));}}拦截器
/*** Description:* author: zh* Create : 2024/11/26* Project_name : short-chain* Version :**/
Component
Slf4j
public class TokenValidationInterceptor implements HandlerInterceptor {private static final String[] filters {Login,swagger,swagger-ui,webjars,api-docs,doc.html,getToken};/*** 验证token是否有效* param request* param response* param handler* return* throws Exception*/Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String servletPath request.getServletPath();for(String filter:filters){if(servletPath.contains(filter)){return true;}}// 获取请求头中的TokenString token request.getHeader(Authorization);if (token null || !isValidToken(token)) {// 如果Token无效返回401未授权状态码response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
// response.getWriter().write(Invalid or missing token);return false; // 阻止请求继续处理}return true;}private boolean isValidToken(String token) {int i AppJwtUtil.verifyToken(AppJwtUtil.getClaimsBody(token));return i2?false:true;}
}配置拦截
Configuration
public class WebMvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TokenValidationInterceptor())// 拦截的路径.addPathPatterns(/**)// 开放的路径.excludePathPatterns(/login, /getToken);}
}