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

有没有一种不需要自己存放 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进行过期时间刷新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值