token的创建和验证
创建token
public class JWTUtil { private static final long EXPIRE_TIME = 3 * 60 * 1000;//默认3分钟 //私钥 private static final String TOKEN_SECRET = "privateKey"; public static String createToken(UserEntity userModel) { try { // 设置过期时间 Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); log.info(String.valueOf(date)); // 私钥和加密算法 Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); // 设置头部信息 Map<String, Object> header = new HashMap<>(2); header.put("Type", "Jwt"); header.put("alg", "HSA256"); // 返回token字符串 return JWT.create() .withHeader(header) .withClaim("username", userModel.getUsername()) .withExpiresAt(date) .sign(algorithm); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 检验token是否正确 * * @param **token** * @return */ public static boolean verifyToken(String token, String username) { log.info("验证token.."); try { Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET); JWTVerifier verifier = JWT.require(algorithm) .withClaim("username",username).build(); // 验证不通过会抛出异常。 verifier.verify(token); return true; } catch (Exception e) { log.info("verifyToken = {}",e.getMessage()); return false; } } // 通过withClaim添加在token里面的数据都可以通过这种方式获取 public static String getUsername(String token){ DecodedJWT jwt = JWT.decode(token); String username = String.valueOf(jwt.getClaim("username")); if (StringUtils.hasLength(username)){ return username; } return null; } }
创建拦截器,拦截请求
@Slf4j @Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 当前端是通过在请求里面以 token="xxxx.xxx.zzz"的方式传递时,通过getHeader("token") // 的方式获取。 String token = request.getHeader("token"); log.info("token = {}",token); if (token == null){ setReturnInfo((HttpServletResponse) response,401,"请携带token"); return false; } // 解析token中的数据,JWTUtil.getUsername(); // 在这里可以通过findUserByUsername的方式从数据源中获取数据 // 假定登录用户是super, 并传递给此方法传递参数 if ( !JWTUtil.verifyToken(token,"super")){ setReturnInfo((HttpServletResponse) response,401,"token已过期"); return false; } return true; } private static void setReturnInfo(HttpServletResponse httpResponse,int status,String msg) throws IOException { log.info("token = null"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", "*"); httpResponse.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); Map<String,String> result =new HashMap<>(); result.put("status",String.valueOf(status)); result.put("msg",msg); httpResponse.getWriter().print(JSONUtils.toJSONString(result)); // 前端可根据返回的status判断 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-04-24 IDEA建立Spring MVC Hello World 详细入门教程