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

5,346 阅读3分钟

前言:

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

准备工作

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

需要用到三方库

  <!--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,小弟在这里谢过啦