JWT封装

该代码示例展示了如何使用Java实现JWTToken的生成、验证以及在SpringMVC中创建一个拦截器来处理Token。Token的有效期为1小时,使用HS256作为加密算法。当请求头中包含sfbi-sso-code时,拦截器会解析Token获取用户信息并存储在ThreadLocal中,便于后续请求访问。
摘要由CSDN通过智能技术生成
import com.alibaba.druid.util.StringUtils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;


import java.util.Date;
import java.util.Map;

public class JwtUtils {

    // TOKEN的有效期1小时(S)
    private static final int TOKEN_TIME_OUT = 600;

    // 加密KEY
//    private static final String TOKEN_SECRET = "vt2oqcwd7x";
    private static String TOKEN_SECRET = null;


    // 生成Token
    public static String getToken(Map params){
        long currentTime = System.currentTimeMillis();
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, TOKEN_SECRET) //加密方式
//                .signWith(SignatureAlgorithm.HS512, TOKEN_SECRET) //加密方式
                .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
                .addClaims(params)
                .compact();
    }


    /**
     * 获取Token中的claims信息
     */
    public static Claims getClaims(String token) {
        return Jwts.parser()
                .setSigningKey(TOKEN_SECRET)
                .parseClaimsJws(token).getBody();
    }


    /**
     * 是否有效 true-有效,false-失效
     */
    public static boolean verifyToken(String token) {
      
        if(StringUtils.isEmpty(token)) {
            return false;
        }
        
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(TOKEN_SECRET)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e) {
            return false;
        }

      return true;
    }
}
import com.it.singlelogin.common.UserThrealocal;
import com.it.singlelogin.entity.User;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TokenIterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       //辨认token是否有效
//        String token = request.getHeader("Authorization");
        String token = request.getHeader("sfbi-sso-code");
        Claims claims = JwtUtils.getClaims(token );
        Integer userId = (Integer) claims.get("id");
        String name = (String) claims.get("name");
        User user = new User();
        user.setId(userId);
        user.setName(name);
        //存入threadlocal中
        UserThrealocal.set(user);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserThrealocal.remove();
    }
}
package com.it.singlelogin.common;

import com.it.singlelogin.entity.User;

public class UserThrealocal {
    private static ThreadLocal<User> threadLocal = new ThreadLocal<>();

    public static void set(User user) {
        threadLocal.set(user);
    }

    public static User get(){
        return threadLocal.get();
    }

    public static Integer getId(){
        return threadLocal.get().getId();
    }

    public static String getMobile() {
        return threadLocal.get().getName();
    }

    public static void remove(){
        threadLocal.remove();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值