欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JWT(json web token)简单入门,Java实现

程序员文章站 2024-01-30 20:29:52
...

有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。

在介绍实现之前,推荐阅读大神阮一峰的一篇博客,博客中有对json web token 理论基础完整且简单明了的阐述。建议在学习jwt具体实现前先看看这篇博客(http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

jwt的官方网站为(jwt.io),进入官网,点击导航栏中的Libraries可以查看各种语言对jwt的封装库,包括java, javascript, python, go等语言。我选择的java库为(https://github.com/jwtk/jjwt),库的具体使用可以查看它的官方页面,这里做个入门介绍。

首先引入maven坐标:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

在实际项目中可以封装一个JWTUtil工具类,定义token生成和token验证的方法:

import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;


import java.security.Key;
import java.util.Date;

public class JWTUtil {

    private static Key key= Keys.secretKeyFor(SignatureAlgorithm.HS256);//定义加密算法
    public static String getToken(String uid)//接收user id生成token
    {
        String token=Jwts.builder()
                .setSubject(uid)//设置uid
                .signWith(key)//设置加密算法
                .setExpiration(new Date(System.currentTimeMillis()+15*60*1000))//设置过期时间15分钟
                .compact();
        return token;
    }

    public static String checkToken(String token)//接收传入的token
    {
        try
        {
            String uid=Jwts.parserBuilder()
                    .setSigningKey(key)//设置解密算法
                    .build()
                    .parseClaimsJws(token)//解析token
                    .getBody()
                    .getSubject();//获取设置的uid
            return uid;
        }catch (ExpiredJwtException e)//超时异常
        {
            return "expired";
        }
        catch (JwtException e)//签名校验异常
        {
            return "invalid";
        }
        catch (Exception e)
        {
            return "invalid";
        }
    }
}

上面的代码只是对校验的简单实现,在实际的网站开发中可以将生成的token放入http的header中返回给前端,前端将得到的token保存在本地,在下次请求时在header中加上token。
上面的代码中并没有对token过期时间的刷新,实际开发中可以在设置一个servlet的过滤器来对token进行过期时间刷新。

相关标签: java jwt