SpringBoot 集成JWT实现token登录(生成token和解token)

前言:

各位同学大家好,有段时间没有给大家更新文章了,具体多久我也不记得,最近有在用 springboot 写了一个本地的服务。因为客户端需要做到自动登录 需要生成token 所以需要学习了springboot中如何实现
那么废话不多说,我们正式开始

准备工作

1安装好idea 或者eclispe +sts开发环境
2安装maven 并配置环境
怎么使用idea 这个工具一键创建springboot工程
这些在我之前的教程都讲的很清楚 这里我就不展开细说 有兴趣的同学可以去看我以前的文章】
Springboot搭建零基础教程:https://www.jianshu.com/p/c48595fdbf39

需要用到三方库

  <!--jsonwebtoken 生成token的库 -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
  • 1生成token

package com.example.boss.utils;
import com.example.boss.bean.User;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class CreateJwt {
    public static String  getoken(User user) {
        //Jwts.builder()生成
        //Jwts.parser()验证
        JwtBuilder jwtBuilder =  Jwts.builder()
                .setId(user.getId()+"")
                .setSubject(user.getUsername())    //用户名
                .setIssuedAt(new Date())//登录时间
                .signWith(SignatureAlgorithm.HS256, "my-123").setExpiration(new Date(new 
         Date().getTime()+86400000));
        //设置过期时间
        //前三个为载荷playload 最后一个为头部 header
        System.out.println(jwtBuilder.compact());
        return  jwtBuilder.compact();
    }
}

运行结果

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNSIsInN1YiI6Inh1cWluZyIsImlhdCI6MTYyNjUxMTE0NCwiZXhwIjoxNjI2NTk3NTQ0fQ.aievYRnhrBir2tlAQ1pE58CvVDmOvzieBECmZeuV3ak
  • 解token

package com.example.boss.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.text.SimpleDateFormat;
//token的解析
//有状态登录  服务器端保存用户信息
//无状态登录  服务器端没有保存用户信息   无状态效率比有状态效率高
public class PraseJwtTest {
    public static void tokenToOut(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey("my-123")
                .parseClaimsJws(token)
                .getBody();
        System.out.println("用户id:"+claims.getId());
        System.out.println("用户名:"+claims.getSubject());
        System.out.println("用户时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                format(claims.getIssuedAt()));System.out.println("过期时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                format(claims.getExpiration()));
        System.out.println("用户角色:"+claims.get("role"));
    }
}

输出日志查看效果

用户id:15
用户名:xuqing
用户时间:2021-07-17 16:39:04
过期时间:2021-07-18 16:39:04

结合springboot实战使用

一般我们使用token 现实场景是在客户端或者前端登录之后我们将用户名和userid 通过一种加密方式生成生命令牌(token)也就所谓的token 在登录成功后返回给客户端 客户端再其他接口请求的时候要通过请求头(请求头)或者body 里面传到后台来做校验 也有通过token刷新token来实现客户端的自动登录的一个情况

具体使用

  • 登录接口
  /***
     *
     * @param username
     * @param password
     * @return
     *  登录
     *
     */
    @RequestMapping(value = "/validlogin")
    public Object validLogin(@RequestParam(value = "username") String username,
                             @RequestParam(value = "password") String password) {
        Map<String, Object> map = new HashMap<>();
        if (TextUtils.Isempty(username) || TextUtils.Isempty(password)) {
            map= BackUtils.backmap(100);
        } else {
            User getUser = userService.validLogin(username, password);
            if(getUser!=null){
                String token=CreateJwt.getoken(getUser);
                map.put("user",getUser);
                map.put("token",token);
                map.put("msg", "登录成功");
                map.put("code", 200);
            }else{
                map.put("msg", "用户名或者密码错误");
                map.put("code", 100);
            }
        }
        return map;
    }

我们在登录成功调用 CreateJwt.getoken(getUser) 方法传入我们的user 对象获取token 并且拼在map里面以json形式返回给客户端

测试效果

image.png

刷新token接口(token登录)

  @RequestMapping("/tokensign")
    public Object tokenSign(@RequestParam(value = "token")String token){
        System.out.println("token ------  >   " + token );
        Map<String,Object>map=new HashMap<>();
        if(TextUtils.Isempty(token)){
            map.put("msg", "请求参数错误或者请求参数缺失");
            map.put("code", 102);
        }else {
            try{
                Claims claims = Jwts.parser()
                        .setSigningKey("my-123")
                        .parseClaimsJws(token)
                        .getBody();
                Integer id=Integer.valueOf(claims.getId());
                System.out.println("用户id:"+claims.getId());
                System.out.println("用户名:"+claims.getSubject());
                System.out.println("用户时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                        format(claims.getIssuedAt()));
                System.out.println("过期时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
                        format(claims.getExpiration()));
                String  username=claims.getSubject();
                User user=userService.querybyid(id);
                if(username!=null&&claims.getId()!=null&&username.equals(user.getUsername())){
                    String gettoken=CreateJwt.getoken(user);
                    map.put("user",user);
                    map.put("token",token);
                    map.put("msg", "登录成功");
                    map.put("code", 200);
                }else {
                    map.put("msg", "token错误");
                    map.put("code", 100);
                }
            }catch (Exception E){
                map.put("msg", "token格式正确");
                map.put("code", 101);
            }
        }
        return map;
    }

我们在tokensign接口里面 我们拿到客户端的token 我们通过 Jwts.parser() 里面提供方法解开token 获取到token里面的携带userid 和username 然后我们通过userid 来查询数据库 然后将我们查到的数据里面username 和我们从token里面解出来username来对比是不是我们的真实用户 来给客户端返回是否能够正确登录

测试效果

image.png

到此SpringBoot 集成JWT实现token登录 我们就讲完了

最后总结

文章主要讲的是springboot里面使用 JWT 三方库的如何生成token 和解token 以及配合springboot 实现常用的token 登录功能。当然本文章使用的完整后端代码是 springboot+jpa + hibernate实现的。有兴趣的朋友可以下载完整代码,这里就不多讲。最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容