杭州制作网站哪家好,哈尔滨网站建设方案开发,响应式网站建设一般多少钱,迅 网站 模板JWT#xff0c;全称JSON Web Token#xff08;JSON Web令牌#xff09;#xff0c;是一个开放标准 (rfc7519)。它定义了一种紧凑的、自包含的方式#xff0c;以JSON对象的形式安全地在各方之间传输信息。这种信息可以被验证和信任#xff0c;因为它是通过数字签名实现的。…JWT全称JSON Web TokenJSON Web令牌是一个开放标准 (rfc7519)。它定义了一种紧凑的、自包含的方式以JSON对象的形式安全地在各方之间传输信息。这种信息可以被验证和信任因为它是通过数字签名实现的。
JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名防止被篡改。JWT基于json非常方便解析可以在令牌中自定义丰富的内容易扩展。通过非对称加密算法及数字签名技术JWT防止篡改安
全性高。 //生成JWTTestpublic void testGenJwt(){MapString,Object claims new HashMap();claims.put(id, 1);claims.put(name, tom);String jwt Jwts.builder().signWith(SignatureAlgorithm.HS256, monian) //签名算法.setClaims(claims) //自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis() 3600 * 1000)) //设置有效期为1h.compact();System.out.println(jwt);}//解析令牌Testpublic void testParseJwt(){Claims claims Jwts.parser().setSigningKey(monian).parseClaimsJws(eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwMTUxMTAwMH0.3ejLF6AimqpzbmTmN6WPcJvxoXAFPT9c5oNbk-0U5o4).getBody();System.out.println(claims);}
}控制台 eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwMTY2Mzc0NX0.HGgjyiW398CeKGosnOXGxd68KF3nJ_R8LYRrkG8-Ih8 在JWT官网解析可得 通过测试类解析令牌可得 Demo测试通过JWT令牌判断用户是否登录否则不能访问相关的数据
Slf4j
WebFilter(urlPatterns /*)
public class LoginCheckFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req (HttpServletRequest) request;HttpServletResponse resp (HttpServletResponse) response;//1.获取请求urlString url req.getRequestURL().toString();log.info(请求的url:{}, url);//2.判断请求url是否包含login如果包含说明是登陆操作放行if (url.contains(login)) {log.info(登陆操作放行...);chain.doFilter(request, response);return;}//3.获取请求头中的令牌(token)String jwt req.getHeader(token);//4.判断令牌是否存在如果不存在返回错误结果(未登录)if (!StringUtils.hasLength(jwt)) {log.info(请求头token为空返回未登录的信息);Result error Result.error(NOT_LOGIN);//手动转化 对象——json ---- 阿里巴巴fast.JSONString notLogin JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//5.解析token如果解析失败返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info(解析令牌失败返回未登录错误信息);Result error Result.error(NOT_LOGIN);//手动转化 对象-- json -------- 阿里巴巴fastJSONString notLogin JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}//6.放行log.info(令牌合法放行);chain.doFilter(request, response);}
}详细解析 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException这是doFilter方法的定义它接收三个参数ServletRequest对象、ServletResponse对象和FilterChain对象。这个方法在过滤器被调用时执行用于处理请求和响应。 HttpServletRequest req (HttpServletRequest) request;将传入的ServletRequest对象强制转换为HttpServletRequest对象以便使用HTTP特定的方法。 HttpServletResponse resp (HttpServletResponse) response;将传入的ServletResponse对象强制转换为HttpServletResponse对象以便使用HTTP特定的方法。 String url req.getRequestURL().toString();获取请求的URL并将其转换为字符串。 String url req.getRequestURL().toString();获取请求的URL并将其转换为字符串。 if (url.contains(login)) {检查URL是否包含login字符串。如果包含说明这是一个登录操作。 String jwt req.getHeader(token);从请求头中获取名为token的值并将其存储在变量jwt中。 if (!StringUtils.hasLength(jwt)) {检查jwt变量是否为空或长度为0。如果为空或长度为0说明没有提供令牌。 String notLogin JSONObject.toJSONString(error);将error对象转换为JSON字符串。 JwtUtils.parseJWT(jwt);尝试解析提供的令牌。如果解析失败将抛出异常。 String notLogin JSONObject.toJSONString(error);将error对象转换为JSON字符串。 resp.getWriter().write(notLogin);将未登录的错误信息写入响应的输出流。