maven依赖
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
utils工具类
public class JwtUtils { private static String signKey = "itheima"; private static Long expire = 43200000L; /** * 生成JWT令牌 * @param claims JWT第二部分负载 payload 中存储的内容 * @return */ public static String generateJwt(Map<String, Object> claims){ String jwt = Jwts.builder() .addClaims(claims) .signWith(SignatureAlgorithm.HS256, signKey) .setExpiration(new Date(System.currentTimeMillis() + expire)) .compact(); return jwt; } /** * 解析JWT令牌 * @param jwt JWT令牌 * @return JWT第二部分负载 payload 中存储的内容 */ public static Claims parseJWT(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey) .parseClaimsJws(jwt) .getBody(); return claims; } }
controller层使用
@PostMapping("/login") public Result login(@RequestBody Emp emp){ log.info("登录所需的信息:{}",emp); Emp e= empService.login(emp); //登录成功 if (e!=null){ Map<String, Object> claims=new HashMap<>(); claims.put("id",e.getId()); claims.put("username",e.getUsername()); claims.put("name",e.getName()); String jwt = JwtUtils.generateJwt(claims); return Result.success(jwt); } //登录失败 return Result.error("用户名或密码错误"); }
filter过滤器代码实现逻辑
HttpServletRequest req= (HttpServletRequest) servletRequest; HttpServletResponse resp= (HttpServletResponse) servletResponse; //1.获取请求路径 String url = req.getRequestURL().toString(); //2.判断请求头中是否包含login,如果包含,直接放行 if (url.contains("login")){ log.info("请求路径为:{}", url); filterChain.doFilter(req,resp); return; } //3.获取请求中的令牌token String token = req.getHeader("token"); //4.检验token是否存在,如果不存在,返回错误结果 if (!StringUtils.hasLength(token)){ log.info("请求失败,token为空,返回未登录的信息",token ); Result not_login = Result.error("NOT_LOGIN"); String notLogin = JSON.toJSONString(not_login); resp.getWriter().write(notLogin); return; } //5.检验token,检验令牌是否合法,如果不合法,返回错误结果 try { JwtUtils.parseJWT(token); } catch (Exception e) { e.printStackTrace(); log.info("解析令牌失败,返回登录错误的信息"); Result error = Result.error("NOT_LOGIN"); String notLogin = JSON.toJSONString(error); resp.getWriter().write(notLogin); return; } //6.token合法,放行 log.info("令牌合法,放行"); filterChain.doFilter(req,resp);