
JWTJSON Web Token用来做登录认证无状态服务端不用存 session把用户信息加密放在令牌里返回给前端。核心流程登录成功 → 后端生成 JWT 返回前端 → 前端每次请求头带上 JWT → 后端校验令牌合法性判断是否登录。JWT 结构3部分header.payload.signaturemaven jjwt-api jjwt-impl jjwt-jacksonjjwt‑api写代码要用编译jjwt‑impl干活实现逻辑运行jjwt‑jacksonJSON 序列化运行dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version scoperuntime/scope /dependency1.header 头部算法类型HS256/RSA2.payload 载荷存放用户信息id、用户名、过期时间base64 编码3.signature 签名密钥 算法加密用来校验令牌有没有被篡改。前端发送POST请求body携带json用户名密码 ↓ RequestBody 接收前端的数据读到map ↓ controller取出username、password调用service ↓ service校验账号密码调用JwtUtil生成token ↓ service把token放入map return给controller ↓ controller return map → Spring自动转为JSON ↓ 【返回前端】前端拿到JSON拿到里面的token字符串使用教程1.先定义一个jwtutil工具类模板public class JwtUtil { // 有效期 14天 (测试用生产建议缩短) public static final long JWT_TTL 60 * 60 * 1000L * 24 * 14; // base64格式密钥不要随便修改 public static final String JWT_KEY SDFGjhdsfalshdfHFdsjkdsfds121232131afasdfac; public static String getUUID() { return UUID.randomUUID().toString().replaceAll(-, ); } /** * 生成jwt * param subject 载荷主体可以放json字符串 / 用户信息 * return token */ public static String createJWT(String subject) { return getJwtBuilder(subject, null, getUUID()).compact(); } private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) { SecretKey secretKey generalKey(); long nowMillis System.currentTimeMillis(); Date now new Date(nowMillis); if (ttlMillis null) { ttlMillis JWT_TTL; } long expMillis nowMillis ttlMillis; Date expDate new Date(expMillis); return Jwts.builder() .setId(uuid) .setSubject(subject) .setIssuer(sg) .setIssuedAt(now) .setExpiration(expDate) .signWith(secretKey); //0.11.5 只传密钥对象自动识别算法 } /** * 还原密钥base64解码 */ public static SecretKey generalKey() { byte[] encodeKey Base64.getDecoder().decode(JWT_KEY); return Keys.hmacShaKeyFor(encodeKey); } /** * 解析token * return Claims 解析失败返回null过期、篡改、格式错误 */ public static Claims parseJWT(String jwt) { try { SecretKey secretKey generalKey(); return Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(jwt) .getBody(); } catch (ExpiredJwtException e) { // token过期 return null; } catch (SignatureException e) { //签名篡改 return null; } catch (MalformedJwtException e) { //token格式错误 return null; } catch (Exception e) { return null; } } }2.登录接口RestControllerRestController只用于接口不做页面跳转全部返回数据RestController是 SpringMVC 组合注解等价于Controller ResponseBody。Controller把类交给 Spring作为控制器接收 http 请求。ResponseBody将方法返回值直接序列化为 JSON写入 HTTP 响应体不再走视图跳转public class LoginController { Autowired private LoginService loginService; PostMapping(/user/account/token/) public MapString,String getToken(RequestBody MapString, String map){ String username map.get (username); String password map.get (password); return loginService.getToken(username,password); } }这个登录接口没有 token需要在 Security 配置放行否则访问会被拦截。3.校验账号密码 返回json结果Service public class LoginServiceImpl implements LoginService { Autowired private AuthenticationManager authenticationManager;//做账号密码校验Security 原生工具。//想要注入它必须在配置类声明Bean否则报找不到 bean。 Override public MapString, String getToken(String username, String password) { UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(username,password);// 封装用户名、密码为认证令牌对象 Authentication authenticate authenticationManager.authenticate(authenticationToken);// 获取认证成功后的用户信息 UserDetailsImpl loginUser (UserDetailsImpl) authenticate.getPrincipal();// 获取认证成功后的用户信息 User user loginUser.getUser(); String jwt JwtUtil.createJWT(user.getId().toString()); MapString, String map new HashMap();//map自动打包成json文件 map.put(error_message,success); map.put(token,jwt); return map; } }