美文网首页Spring Boot 项目 技术点学习
SpringBoot 集成JWT实现token登录(生成toke

SpringBoot 集成JWT实现token登录(生成toke

作者: xq9527 | 来源:发表于2021-07-17 17:43 被阅读0次

    前言:

    各位同学大家好,有段时间没有给大家更新文章了,具体多久我也不记得,最近有在用 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,小弟在这里谢过啦

    相关文章

      网友评论

        本文标题:SpringBoot 集成JWT实现token登录(生成toke

        本文链接:https://www.haomeiwen.com/subject/lpswpltx.html