JWT笔记

本文展示了如何在Java应用中使用jjwt库创建JWT,包含设置Header、Payload和Signature,并进行加密。测试类中创建和解析JWT,实体类用于用户信息,工具类提供生成和验证JWT的方法。控制器处理登录和验证请求,前端部分涉及Vue.js路由的权限检查以及axios请求进行token验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jwt由三部分组成用.拼接

  • Header

  • Payload

  • Signature

依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

测试类

public class DemoApplicationTests {
	//过期时间
    private long time = 1000*60*60*24;
    //key
    private static String signature = "admin";
    
    //加密
    @Test
    public void contextLoads() {
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtToken = jwtBuilder
                //Header
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg","HS256")
                //payload
                .claim("username","tom")
                .claim("role","admin")
                .setSubject("admin-test") //签名
                .setExpiration(new Date(System.currentTimeMillis()+time))
                .setId(UUID.randomUUID().toString())
                //Signature
                .signWith(SignatureAlgorithm.HS256,signature)
                .compact();
    }

    //解析token
    @Test
    public void parse(){
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NjE1MDU0MTIsImp0aSI6IjY0OGFmMTM2LWEwY2EtNGRmZC1iZjhiLTA5ZjQ0Njg0YjI5NSJ9.whOUY5IwPSr-iyP_fGJgWt_812skGtsAia_m5ejJF_0";
        JwtParser jwtParser = Jwts.parser();
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();

        System.out.println(claims.get("username"));
        System.out.println(claims.get("role"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());
        System.out.println(claims.getExpiration());
    }

}

实体类

@Data
public class Userjwt {
    private String username;
    private String password;
    private String token;
}

工具类

public class JwtUtil {
    //有效时间
    private static long time = 1000*60*60*24;
    //key
    private static String signature = "admin";

    //生成json方法
    public static String createToken(){
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtToken = jwtBuilder
                //Header
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg","HS256")
                //payload
                .claim("username","admin")
                .claim("role","admin")
                .setSubject("admin-test") //签名
                .setExpiration(new Date(System.currentTimeMillis()+time))
                .setId(UUID.randomUUID().toString())
                //Signature
                .signWith(SignatureAlgorithm.HS256,signature)
                .compact();
        return jwtToken;
    }

    //解析token方法
    public  static boolean chechToken(String token) {
        //判断token是否存在
        if(token == null) {
            return false;
        }
        //是否可以成功解析token
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
        } catch (Exception e) {
            return false;
        }

        return true;
    }
}

控制层

@RestController
@CrossOrigin //支持跨域
public class UserController {

    private final String USERNAME = "admin";
    private final String PASSWORD = "123123";

	//生成并发送token
    @GetMapping("/loginjwt")
    public Userjwt loginjwt(Userjwt userjwt){
        if(USERNAME.equals(userjwt.getUsername()) && PASSWORD.equals(userjwt.getPassword())) {
            userjwt.setToken(JwtUtil.createToken());
            return userjwt;
        }
        return null;
    }

    //解析json接口
    @GetMapping("/checkToken")
    public Boolean checkToken(HttpServletRequest request) {
        String token = request.getHeader("token");
        return JwtUtil.chechToken(token);
    }
    
}
前端

路由index.js

router.beforeEach((to, from, next) => {
  if (to.path.startsWith('/login')) {
    window.localStorage.removeItem('access-admin')
    next()
  } else {
    let admin = JSON.parse(window.localStorage.getItem('access-admin')) 
    if (!admin) {
      next({path: '/login'})
    } else {
      //校验token合法性
      axios({
        url:'http://localhost:8080/checkToken',
        method:'get',
        headers:{
          token:admin.token
        }
      }).then((response) => {
        console.log(response.data)
        if(!response.data){
          console.log('校验失败')
          next({path: '/error'})
        }
      })
      next()
    }
  }
})

请求方法

            handleSubmit(){
                this.$refs.ruleForm.validate((valid) => {
                    if(valid){
                        let _this = this
                        axios.get('http://localhost:8080/login',{params:_this.ruleForm}).then(function (response) {
                            if(response.data!=null){
                                localStorage.setItem('access-admin',JSON.stringify(response.data))
                                _this.$router.replace({path:'/'})
                            }
                        })
                    }else{
                        console.log('error submit!');
                        return false;
                    }
                })
            }

js中将json转为字符串 JSON.stringify(json数据)

还原数据 JSON.parse()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值