Java 如何做 JWT

如果你平时登录网站时,输入账号密码后,没有再反复登录,大概率是用到了JWT。这个能帮网站“记住”你身份的东西,用Java实现起来其实没那么复杂,就像给用户发了一张“临时通行证”,走到哪都能验证身份。

先搞懂JWT到底是什么

很多人刚接触JWT,会把它当成加密密码,其实它更像一张带信息的电子小票。举个生活化的例子:你去连锁咖啡店办了储值卡,店员给你打了一张小票,上面写着“张三,储值100元,有效期7天”——这张小票就是JWT。它的结构分三部分,就像小票的三段:最前面是标识类型的“头”,中间是存关键信息的“载荷”,最后是防篡改的“签名”。

Java 如何做 JWT

对Java来说,JWT不是什么复杂的框架,我们只需要用成熟的工具包就能快速实现,不用自己从头写加密逻辑,毕竟安全才是最重要的。

第一步:给项目加个“小票生成工具”

就像你要打印那张咖啡店小票,得先有打印机,Java里生成JWT也需要依赖包。最常用的就是java-jwt,它是Auth0推出的,稳定又好用。如果你用Maven项目,只要在pom.xml里加几行依赖就行,不用自己下载一堆文件:

`xml

<dependency>

<groupId>com.auth0</groupId>

<artifactId>java-jwt</artifactId>

<version>4.4.0</version>

</dependency>

`

加完刷新一下,相当于把“小票打印机”装好了,接下来就能开始做具体的逻辑。

第二步:写个生成JWT的“小票打印逻辑”

当用户登录成功时,我们就要给他们发JWT了。还是用咖啡店的例子:顾客报了会员名,确认储值有效,就给打小票。对应到Java里,就是写一个生成JWT的方法,核心是填好载荷里的关键信息,再用密钥签名。

比如,载荷里不能放敏感信息(像密码),只能放非隐私的身份标识,比如用户ID、用户名、过期时间。过期时间很重要,就像咖啡店小票7天有效,JWT也不能永久用,一般设成1小时到24小时,防止泄露后被滥用。

举个简单的代码例子:

`java

// 定义一个只有自己知道的密钥,就像咖啡店的专属防伪章

private static final String SECRET = "MyCoffeeStoreSecret123456789";

public String generateJwt(String userId, String username) {

// 设置过期时间,当前时间加1小时

long expireTime = System.currentTimeMillis() + 3600 * 1000;

// 生成JWT,把需要的信息放进去,最后用密钥签名

return JWT.create()

.withClaim("userId", userId)

.withClaim("username", username)

.withExpiresAt(new Date(expireTime))

.sign(Algorithm.HMAC256(SECRET));

}

`

调用这个方法,就能得到一串类似eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTcxNzY5NzYwMH0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c的字符串,这就是给用户的“临时通行证”了。

第三步:写个验证JWT的“小票验真逻辑”

用户每次访问需要登录的页面,都要把这个JWT放在请求里(比如请求头的Authorization字段),后端要先验证这张“小票”是不是真的,有没有过期。

验证的核心是两个点:有没有被篡改、有没有过期。还是用咖啡店的例子:你拿小票去结账,店员会看章是不是真的、有没有超过7天有效期,对应到Java里就是用同一个密钥来验证签名,再检查过期时间。

代码也很简单:

`java

public boolean verifyJwt(String token) {

try {

// 用同一个密钥验证JWT,没问题就返回true,有问题会抛异常

JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

verifier.verify(token);

return true;

} catch (Exception e) {

// 不管是小票是假的,还是过期了,都返回无效

return false;

}

}

`

如果验证通过,就能拿到里面的用户信息,比如你要查用户的订单,就从JWT里取userId,不用再让用户输一遍密码,这就是JWT的作用——让用户少折腾,后端也不用反复查数据库。

注意这几个实用小细节

就像咖啡店的小票不能随便打印,用JWT时也有几个要注意的地方:第一,密钥要放在后端,不能写在前端代码里,不然别人能自己生成假的JWT;第二,载荷里别放敏感信息,虽然JWT的内容不是加密的,但能被解码,就像小票上的名字,谁都能看清,所以别写银行卡号;第三,过期时间别设太长,一般1小时左右最合适,万一JWT泄露了,也不会有太大风险。

总的来说,Java实现JWT就是“装工具→填信息签名→验真”这三步,只要用成熟的工具包,避开这些小坑,就能轻松实现用户身份验证,不用再写复杂的登录状态管理逻辑。

上一篇 JavaScript Jest 怎么用