jwt工具类封装与统一拦截

直接进入正题

引入依赖

 <!--    token依赖-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.10.0</version>
        </dependency>
        <!--        序列化-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <!--    token依赖 end-->
             <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

实体类

@Data
public class User {
    private Integer id;
    private String name;
    private String sex;
    private String email;
    private String phone;
    private String password;
    private String userpic;
    private Integer isLocked;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createdtime;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date updatedtime;
}

工具类

public class JwtUtils {
    private static final String KEY = "casual";

    /**
     * 生成token
     * @param user
     * @return
     */
    public static  String createToken(User user){
//        设置过期时间,1天过期
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR,1);
//        claim :声明
        JWTCreator.Builder builder = JWT.create()
//                payload的内容,由一个个的claim组成
        .withClaim("userInfo", JSON.toJSONString(user))
                .withExpiresAt(calendar.getTime());
        String token = builder.sign(Algorithm.HMAC256(KEY));
        return token;
    }

    /**
     * token校验
     * @param token
     * @return
     */
   public static DecodedJWT verify (String token){
        DecodedJWT verify = null;
        try{
            verify = JWT.require(Algorithm.HMAC256(KEY)).build().verify(token);
        }catch (SignatureVerificationException e){
            e.printStackTrace();
            System.out.println("签名不一致");
        }catch (TokenExpiredException e){
            e.printStackTrace();
            System.out.println("令牌过期");
        }catch (AlgorithmMismatchException e){
            e.printStackTrace();
            System.out.println("签名算法不一致");
        }catch (InvalidClaimException e){
            e.printStackTrace();
            System.out.println("payload不可用");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("校验失败");
        }
        return verify;
   }
    /**
     * token解析为User对象
     * @return
     */
   public static User tokenParse(DecodedJWT decodedJWT){
       Claim claim = decodedJWT.getClaim("userInfo");
       if (claim != null){
           String userString = claim.asString();
           User user = JSON.parseObject(userString,User.class);
           return user;
       }else {
           return  null;
       }
   }
}

测试类

public class Tokentest {
    
    String token = null;
    @Test
    public void  test(){
        User user= new User();
        user.setId(1);
        user.setName("李华");
        token = JwtUtil.createToken(user);
        System.out.println(token);
        DecodedJWT decodedJWT = JwtUtil.verify(token);
        if (decodedJWT != null){
            User user1 = JwtUtil.tokenParse(decodedJWT);
            System.out.println(user1.toString());
        }
    }
}

结果
在这里插入图片描述
当然如果我们每个结果都写一次拦截判断就使得会代码变得冗余,所以我们需要写一个配置类来拦截请求
编写拦截器

//token统一拦截处理

/**
 * token验证拦截
 */
@Configuration
public class JwtInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 取得token
        String token = request.getHeader("token");
        if (token != null) {
            DecodedJWT decodedJWT = JwtUtils.verify(token);
            if (decodedJWT != null) {
                User user = JwtUtils.tokenParse(decodedJWT);
//                System.out.println(user);
                System.out.println("我是拦截器的------》"+token);
                if (user != null) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}
@Configuration
public class CORSConfiguration extends WebMvcConfigurationSupport {

    /**
     * 这里主要为了解决跨域问题,所以重写addCorsMappings方法
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("access-control-allow-headers",
                        "access-control-allow-methods",
                        "access-control-allow-origin",
                        "access-control-max-age",
                        "X-Frame-Options")
                .allowCredentials(false).maxAge(3600);
        super.addCorsMappings(registry);
    }

    /**
     * 这里主要是处理token统一拦截,在引入JwtInterceptor类
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截路径可自行配置多个可用 ,分隔开,写控制层的路径
        registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/user/**");
    }
}

效果
携带token
在这里插入图片描述

在这里插入图片描述
不携带token
在这里插入图片描述
在这里插入图片描述

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。一般来说,JWT 用于认证和授权,其主要应用场景为 API 接口鉴权。生成 JWT 的流程可以通过拦截器来实现,以下是一个简单的生成 JWT 令牌的拦截器实现过程: 1. 创建一个 JWT 工具类,用于生成和解析 JWT 令牌。 2. 创建一个 JWT 拦截器类,该类需要实现 HandlerInterceptor 接口。 3. 在 preHandle 方法中,判断当前请求是否需要生成 JWT 令牌,如果需要,则使用 JWT 工具类生成令牌,并将其存储在请求头中。 4. 在 postHandle 方法中,将生成的 JWT 令牌返回给客户端。 5. 在 afterCompletion 方法中,清除请求头中的 JWT 令牌。 以下是一个简单的生成 JWT 令牌的拦截器示例: ``` public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 判断当前请求是否需要生成 JWT 令牌 if (request.getRequestURI().startsWith("/api/")) { // 获取用户信息 User user = (User) request.getSession().getAttribute("user"); // 判断用户信息是否为空 if (user != null) { // 使用 JWT 工具类生成令牌 String token = JwtUtils.generateToken(user); // 将生成的 JWT 令牌存储在请求头中 response.setHeader("Authorization", token); } else { // 用户信息为空,返回未授权状态码 response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 将生成的 JWT 令牌返回给客户端 response.setHeader("Authorization", response.getHeader("Authorization")); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 清除请求头中的 JWT 令牌 response.setHeader("Authorization", null); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值