Jwt的新手入门教程( 二 )

<>();String username = user.getUsername();String password = user.getPassword();// 省略 账号密码验证// 验证成功后发送tokenString token = JwtUtil.sign(username, password);if (token != null) {map.put("code", "200");map.put("message", "认证成功");map.put("token", token);return map;}map.put("code", "403");map.put("message", "认证失败");return map;}@GetMapping(value = "http://www.kingceram.com/api/test")public String get(){System.out.println("执行了get请求");return "success";}}
服务类:
【Jwt的新手入门教程】@Servicepublic class UserService {public String getPassword(){return "admin";}}
实体类 User
@Datapublic class User {private String username;private String password;}
自定义拦截器类
@Componentpublic class JwtInterceptor implements HandlerInterceptor {@AutowiredUserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从 http 请求头中取出 tokenString token = request.getHeader("token");// 如果请求不是映射到方法直接通过if(!(handler instanceof HandlerMethod)){return true;}if (token != null){String username = JwtUtil.getUserNameByToken(request);// 这边拿到的 用户名 应该去数据库查询获得密码,简略,步骤在service直接获取密码boolean result = JwtUtil.verify(token,username,userService.getPassword());if(result){System.out.println("通过拦截器");return true;}}return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}}
Jwt工具类
public class JwtUtil {// Token一天后过期public static final long EXPIRE_TIME = 1000 * 60 * 60 * 24;//检验Token是否正确public static boolean verify(String token, String username, String secret) {try {// 设置加密算法Algorithm algorithm = Algorithm.HMAC256(secret);JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();// 效验TOKENDecodedJWT jwt = verifier.verify(token);return true;} catch (Exception exception) {return false;}}public static String sign(String username, String secret) {//现在系统的时间 + 一天Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);//对密码进行加密Algorithm algorithm = Algorithm.HMAC256(secret);// 附带username信息return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);}public static String getUserNameByToken(HttpServletRequest request){String token = request.getHeader("token");DecodedJWT jwt = JWT.decode(token);return jwt.getClaim("username").asString();}}?
具体代码,可以加入我的企鹅君羊:、暗号67
也可以看我制作的视频教程:代码教程
这里代码的则是用户的密码 。
我们先通过向/login接口发送我们的账号密码,得到Jwt根据我们的账号密码生成的token 。
{"code": "200","message": "认证成功","token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzIzMTg1NjksInVzZXJuYW1lIjoiYWRtaW4ifQ.c_m3z11UOcFcS_hZN9KNlidzZ2j6y_Ugkb9awHQ3FGY"}
这里认证成功后,服务器如果不经过我们其他的存储操作,是不会对生成的token进行持久化或其他控制的,所以一旦签发出去,这个token串就会变成无状态了 。
? 接着,我们访问一下我们的api测试接口,因为我们在里配置了全局拦截器,且重写了类,除了/login路径,其他全路径都需要请求的(请求头)中带有token字段,且需验证token成功后才会允许访问,否则进行拦截 。