首页 > 其他分享 >JWT的生成和校验

JWT的生成和校验

时间:2024-02-02 11:34:19浏览次数:24  
标签:和校验 return JWT hutool 生成 token org import

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。 JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 1、头部(Header): 包含了关于生成该 JWT 的信息以及所使用的算法类型。 2、载荷(payload): 包含了要传递的数据,例如身份信息和其他附属数据。 3、签名(Signature): 使用密钥对头部和载荷进行签名,以验证其完整性。    记录JWT如何生成和校验 使用hutool工具生成和校验 1、引入hutool依赖

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>

2、在业务代码中简单生成JWT,接口返回token

@PostMapping("/login")
public ResponseResult login(String username,String password){
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
return ResponseResult.fail(1,"参数有误");
}
// 账号密码的校验
LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserInfo::getUserName,username);
UserInfo userInfo = userService.getOne(wrapper);
if (ObjectUtils.isEmpty(userInfo)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
if (!userInfo.getPassword().equals(password)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
Map<String,Object> map = new HashMap<>(){
private static final long serialVersionUID = 1L;
{
put("uid",userInfo.getUid());
// 15天时间后过期
put("exp",System.currentTimeMillis() + 1000 * 60 * 60 * 24* 15);
}
};
String token = JWTUtil.createToken(map, AppVariable.JWT_SECRET.getBytes());
return ResponseResult.success(token);
}

这里不用在意前面的密码校验,主要就是map开始生成。

map其实就是载荷,保存用户信息,至于保存什么,可自行决定。

下面是关于如何校验token,和生成一样,也是采用hutool里面的JWTUtil,以下是代码

package org.ongoal.gateway.filter;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import org.ongoal.common.ResponseResult;
import org.ongoal.common.config.AppVariable;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

@Component
public class AuthFilter implements GlobalFilter , Ordered {

    private String[] skipAuthUrl = {"/user/login"};


    @Override
    public  Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String url = exchange.getRequest().getURI().getPath();
        for (String s : skipAuthUrl) {
            if (s.equals(url)){
                return chain.filter(exchange);
            }
        }
        ServerHttpResponse response = exchange.getResponse();
        //登陆判断
        List<String> tokens = exchange.getRequest().getHeaders().get(AppVariable.TOKEN_KEY);
        if (CollUtil.isEmpty(tokens)){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        // token不为空
        String token = tokens.get(0);
        boolean verify = false;
        try {
            verify = JWTUtil.verify(token, AppVariable.JWT_SECRET.getBytes());  // 这行就是JWTUtil解析token
        }catch (Exception e){
            verify = false;
        }
        if (!verify){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }else {
            //看下是否过期
            final JWT jwt = JWTUtil.parseToken(token);
            // 得到过期时间
            Object expObj = jwt.getPayload("exp");
            if (ObjUtil.isEmpty(expObj)){
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
            long exp = Long.parseLong(expObj.toString());
            if (System.currentTimeMillis() >= exp){
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {

        return 0;
    }
}

主要就是这段校验

 至此,简单的JWTUtil生成token和校验token完成。

以上为demo,只作为个人学习笔记!

           

标签:和校验,return,JWT,hutool,生成,token,org,import
From: https://www.cnblogs.com/qwg-/p/18002086

相关文章

  • 新型生成式 AI 助手 Amazon Q(预览版)上线
    今天,我们宣布推出AmazonQ,这是一种新型的生成式人工智能助手,专门用于满足办公场景需要,可以根据客户业务进行定制。客户可以使用AmazonQ进行对话、解决问题、生成内容、获取见解并采取行动,所有这些都基于客户自身的信息存储库、代码、数据和企业系统。AmazonQ为员工提供即时......
  • 最小生成树
    概念 第1题   生成树任何一个无向连通图的最小生成树 1.有一棵或多棵   正确 2.只有一棵 错误 3.一定有多棵 错误 4.可能不存在 错误  第2题   生成树有几个以下叙述中,正确的是()1.只要无向连通图中没有权值相同的边,则其最小生成树......
  • UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子
    UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子(自己学习记录一下,不一定合理,仅供参考)本例子是使用ADO等组件连接一个云服务器的一个数据库,调用GetOrg存储过程,把机构信息展现把结果导出的一个EXECL表里,并下载把显示的HSate的值进行替换1表示正常,其他表示暂停......
  • 3. 统计学生成绩
    objecttest3{caseclassstudent(id:String,gender:String,score:Map[String,Int])//读取文件的方法:definputStudentList(filename:String):List[student]={//读取文件并按行进行切割varlines=scala.io.Source.fromFile(filename).getLine......
  • 文心一言APP上线新功能,一张照片、三句话即可生成专属数字分身
    只需一张照片、录制三句话,就能拥有一个自己的数字分身?这不是科幻电影,而是文心一言APP上线的新功能-数字分身。目前,文心一言APP正在内测数字分身新功能,明天起,iOS和Android用户升级新版本后,均可免费使用该功能,极速体验创建和使用数字分身的乐趣。据了解,文心一言APP新功能极大缩短了......
  • laravel生成二维码,并添加背景图片,图标logo
    1、安装组件composerrequiresimplesoftwareio/simple-qrcode1.3.*在 config/app.php 注册服务提供者:SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class同样在 config/app.php 添加 QrCode 门面:'QrCode'=>SimpleSoftwareIO\QrCode\Facades\QrCode::class2......
  • 后台生成单个Word文档
    在实际项目开发中经常会遇到一种场景,客户希望点击页面上的生成文件按钮,执行程序动态填充数据到Word模板,直接在后台生成Word文档,而无需显示Word文档。目前网上有一些针对此需求的方案,但每个方案都存在很多各自的问题。与其他方案对比采用Jacob生成Word文档方案动态生成的Word文......
  • AI生成代码加速代码屎山噩梦?
    如今,许多程序员选择使用AI来辅助编程,但是随着AI软件开发的快速普及,有关代码质量的担忧越发凸显。长期从事代码研究的AdamTornhill曾表示,AI辅助编程所面临的主要挑战是,它很容易生成大量原本无需编写的代码。根据最新的研究,结果确实令人担忧。除了代码反复修改后被删除的问题,重复代......
  • 最小生成树
    曼哈顿距离:51nod1213|POJ3241切比雪夫距离:ARC076B欧几里得距离:P6362异或:CF888G|nowcoder920B(题面·题解)大佬博客:1|2......
  • AI生成前端组件的价值思考
    想法来源这个想法来源于我自己的需求,我自己首先就是最精准的目标用户,在这个AI时代,我希望AI可以帮我尽量多地干活。结合自己的日常独立开发情况,发现花在调前端组件样式上的时间很多,因此思考能不能让AI把这部分活接过去,或者能提高一些效率也行。适合用户外行或刚入门的前端开发......