JWT学习笔记

JWT(JSON Web Token)

生成JWT

  • 添加依赖

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.10.3</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    
  • 生成token

    String token = builder.setSubject(name)     //主题,就是token中携带的数据
        .setIssuedAt(new Date())            //设置token的生成时间
        .setId(user.getUserId() + "")       //设置用户id为token id
        .setClaims(hashMap)                 //map中可以存放用户的角色权限信息
        .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000))
                                            //设置token过期时间
        .signWith(SignatureAlgorithm.ES256, "jyh9961")
        .compact();                         //设置加密方式和加密密码
    
  • 解析token

    if(token == null){
        return new ResultVO(ResStatus.NO.getCode(), "请登录", null);
    }else {
        //验证token
        JwtParser parser = Jwts.parser();//解析器
        parser.setSigningKey("jyh9961");//解析token的密码必须与生成的一致
    
        try {
            Jws<Claims> claimsJws = parser.parseClaimsJws(token);
    
            Claims body = claimsJws.getBody();//获取token中的数据
    
            String subject = body.getSubject();//获取生成token设置的subject
            String v1 = body.get("key1",String.class);//获取生成token时储存的Claims的map中的值
    
            return new ResultVO(ResStatus.OK.getCode(), "success", null);
        } catch (ExpiredJwtException e) {
            return new ResultVO(ResStatus.NO.getCode(), "登录过期,请重新登录", null);
        } catch (UnsupportedJwtException e) {
            return new ResultVO(ResStatus.NO.getCode(), "Token不合法", null);
        } catch (Exception e) {
            return new ResultVO(ResStatus.NO.getCode(), "请重新登录", null);
        }
    }
    
  • 拦截器校验Token

    • 创建拦截器
    public class CheckTokenInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            String token = request.getParameter("token");
            if(token == null){
                ResultVO resultVO = new ResultVO(ResStatus.NO.getCode(), "请先登录", null);
                //提示先登录
                doResponse(response, resultVO);
            }else {
                try {
    
                    JwtParser parser = Jwts.parser();//解析器
                    parser.setSigningKey("jyh9961");//解析token的密码必须与生成的一致
                    Jws<Claims> claimsJws = parser.parseClaimsJws(token);
                    return true;
                } catch (ExpiredJwtException e) {
                    ResultVO resultVO = new ResultVO(ResStatus.NO.getCode(), "登录过期,请重新登录", null);
                    doResponse(response, resultVO);
                } catch (UnsupportedJwtException e) {
                    ResultVO resultVO = new ResultVO(ResStatus.NO.getCode(), "Token不合法,请重新登录", null);
                    doResponse(response, resultVO);
                } catch (Exception e) {
                    ResultVO resultVO = new ResultVO(ResStatus.NO.getCode(), "请先登录", null);
                    doResponse(response, resultVO);
                }
    
            }
            return false;
        }
    
        private void doResponse(HttpServletResponse response,ResultVO resultVO) throws IOException {
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            String s = new ObjectMapper().writeValueAsString(resultVO);
            out.print(s);
            out.flush();
            out.close();
        }
    
    • 配置拦截器

      新建拦截器配置类

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private CheckTokenInterceptor checkTokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建拦截url集合
        ArrayList<String> PathPatternsList = new ArrayList<>();
        PathPatternsList.add("/shopcart/**");
        PathPatternsList.add("/orders/**");

        registry.addInterceptor(checkTokenInterceptor)
                //拦截的url
                .addPathPatterns(PathPatternsList)
                //放行的url
                .excludePathPatterns("/user/**");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容