基于springboot实现JWT登录拦截及验证(超详细版)

JWT

小白勿喷版,但超详细!
有错误、有更好的思路、更好的实现方式请评论区留言更正,感谢!

  • 依赖
<!-- Jwt -->
        <!-- JWT -->
<!--        <dependency>-->	
<!--            <groupId>com.auth0</groupId>-->
<!--            <artifactId>java-jwt</artifactId>-->
<!--            <version>3.4.1</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <!-- 常用工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
        </dependency>
        <!--避免使用jwt时,jdk版本太低导致的问题-->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>

1.两个Jwt依赖用哪个都可以,生成token的语法略有不同
2.如果使用jjwt这个,且JDK版本高于1.8,需要配合jaxb-api来使用,否则会报错:
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
因为 javax.xml.bind这个东西在1.8有,在高版本就没有了
3.用jjwt的话,密钥不能设置太短,否则也报错
java.lang.IllegalArgumentException: secret key byte array cannot be null or empty.

  • Jwt工具类
import cn.hutool.core.util.StrUtil;
import cn.lhn.dto.UserDTO;
import cn.lhn.service.IUserService;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class JwtUtil {
   
    //token过期时间
    private static final int EXPIRATION_TIME = 2;
    //密钥
    private static final String SECRET = "arbitrary!@#QWE";

    private static IUserService staticUserService;  //静态方法需要静态的属性
    @Autowired
    private IUserService userService;
    @PostConstruct
    public void setUserService(){
   
        staticUserService = userService;
    }
    /**
     * 使用userId、password生成token
     * @param userId 用户id
     * @return
     */
    public static String createToken(Integer userId){
   
        //头部信息map
        Map<String,Object> claims = new HashMap<>();
        claims.put("userId",userId);
        return Jwts.builder().setClaims(claims)     //body数据
                .signWith(SignatureAlgorithm.HS256,SECRET)  //签发算法 , 密钥
                .setIssuedAt(new Date())    //签发时间
                .setExpiration(DateUtil.setAddHour(EXPIRATION_TIME)).compact();     //token有效期
    }

    /**
     * 获取用户登录信息
     * @return  User
     */
    public static UserDTO getCurrentUser(String token){
   
        if (StrUtil.isBlank(token))
            return null;
        Map<String,Object> map = verifyToken(token);
        if (map == null)
            return null;
        UserDTO user = new UserDTO();
        user.setUserId((Integer) map.
  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员十六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值