JWT凭证生成及验证_jwtverifier-程序员宅基地

技术标签: Java  jwt  springboot  

  1. 引入依赖
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
 </dependency>
  1. JWT工具类
public class JWTUtil {
    

    //签名
    private static final String SING = "#$er#$#%AFD(";
    //生成token
    public static String getToken(Map<String,Object> map) {
    
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,7);
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
    
            builder.withClaim(k, v.toString());
        });
        builder.withExpiresAt(instance.getTime());
        String token = builder.sign(Algorithm.HMAC256(SING));
        return token;
    }
    //验证token合法性
    public static DecodedJWT verifyToken(String token) {
    
       return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);//
    }
}
  1. 拦截器拦截每一个请求,验证身份

前端发送请求,将token放进Header中,拦截器拦截请求后,获取token,并验证是否合格。

@Configuration
public class JWTInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
        Map<String,Object> map = new HashMap<>();
        //获取请求头中令牌
        String token = request.getHeader("token");
        try{
    
            JWTUtil.verifyToken(token);
            return true;
        }catch (SignatureVerificationException e) {
    
            e.printStackTrace();
            map.put("msg","无效签名");
        }catch(TokenExpiredException e){
    
            e.printStackTrace();
            map.put("msg","token过期");
        }catch (AlgorithmMismatchException e) {
    
            e.printStackTrace();
            map.put("msg","token算法不一致");
        }catch (InvalidClaimException e) {
    
            e.printStackTrace();
            map.put("msg","token无效");
        }
        map.put("token",false);
        String json = new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().println(json);
        return false;
    }
}

/**
并在WebMvcConfigurer配置类中注册拦截器,添加拦截目标
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
        registry.addInterceptor(new JWTInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}
  1. 生成token
    用户第一次登陆,如果账号密码验证成功,就会给其生成一个token,并将其返还给用户
 @GetMapping("/login")
    public Map<String,Object> login(String name,String password){
    

        Map<String,Object> map = new HashMap<>();
        try{
    
            User user = iLeaderService.login(name,password);
            Map<String,Object> payload = new HashMap<>();
            payload.put("id",user.getId());
            payload.put("name",user.getname());
            payload.put("password",user.getPassword());
            String token = JWTUtil.getToken(payload);

            map.put("state",true);
            map.put("msg","登陆成功成功");
            map.put("token",token);

        }catch (Exception e) {
    
            map.put("state",false);
            map.put("msg",e.getMessage());
        }
       return map;
    }
  1. 获取token存储信息

    public void test(HttpServletRequest request) {
    
        String token = request.getHeader("token");
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("#$er#$#%AFD(")).build();
        DecodedJWT verify = jwtVerifier.verify(token);
        
        Integer id = verify.getClaim("userId").asInt();
        String username = verify.getClaim("userName").asString();
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44606649/article/details/110687367

智能推荐

电脑怎么通过ip地址进入linux系统,如何远程登陆已知IP地址的电脑?-程序员宅基地

文章浏览阅读2k次。大家糟糕,于我们的学习工作之中,远程登陆已经知IP地址的电脑也许会常常用到,今天小编便与大家讲解几种方法,区别windows系统与linux系统:一、windows系统这里重要是利用远程控制软件来构建,假如是局域网,系统自从带的远程桌面相连便路,假如是非局域网,常用的远程控制软件便路。1.局域网这里重要是利用远程控制软件来构建,假如是局域网,系统自从带的远程桌面相连便路,假如是非局域网,常用的远程..._通过ip进入linux系统

华为ensp基于 STP 的可靠网络配置_ensp 部署stp-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏41次。基于 STP 的可靠网络配置网络技术是一个广阔而不断演化的领域,不断学习和不断更新知识是成功的关键。你已经迈出了第一步,学习并部署STP,这只是冰山一角。继续前进,探索更多的网络协议和技术,不断提高自己的技能_ensp 部署stp

面试常考题-程序员宅基地

文章浏览阅读553次。基础篇:操作系统、计算机网络、设计模式一:操作系统1. 进程的有哪几种状态,状态转换图,及导致转换的事件。2. 进程与线程的区别。3. 进程通信的几种方式。4. 线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)5. 线程的实现方式. (也就是用户线程与内核线程的区别)6. 用户态和核心态的区别。7. 用户栈和内核栈的区_面试常考题

彩虹系统怎么弄服务器,用云服务器彩虹挂机-程序员宅基地

文章浏览阅读501次。用云服务器彩虹挂机 内容精选换一换当云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等场景均可能导致云服务器无法正常登录。当您的云服务器无法远程登录时,我们建议您首先检查是否可以通过控制台远程登录。再参考排查思路检查登录异常的原因。远程登录失败时,请首先尝试能否通过管理控制台,使用VNC方式登录云服务器。单击这里了解云服务器登录前的准备工作。登录管理本文介绍如何在 Linux..._彩虹引擎云服务器架设

AI润色网站:让文章华丽变身,写作轻松享受-程序员宅基地

文章浏览阅读257次,点赞5次,收藏4次。人工智能(AI)技术在文章润色领域的应用随着 AI 技术日新月异,其应用范围涵盖多个领域,其中包括文章润色网站。该技术运用自然语言处理及机器学习算法,助益提升文章品质,提高阅读体验,让作者享受更优质的写作过程。用户只需上传文稿至AI润色网站,即可实现自动化校正、修订及建议服务

linux查看端口命令_liunx中如何查端口号命令-程序员宅基地

文章浏览阅读1.4k次。netstat -an|grep 80 查看80端口进程列表_liunx中如何查端口号命令

随便推点

Windows XP Server2003 Me 98 2000下载-程序员宅基地

文章浏览阅读369次。大量操作系统迅雷下载(不是BT) WindowsXP 家庭版不用多做解释了吧!WindowsXP原版ISOSN:KWXXK-KD43C-86JQV-6BM33-FBMXG点击下载:==============================ftp://down:[email protected]/system/winxp_home_cn.iso=====..._windows me 原版iso

pr 基本操作_pr基本操作-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏16次。1、文件夹直接拖、项目面板双击,导入单个或者多个,或者文件夹;项目左下角,改变视图;项目右下脚,可新建文件夹管理(素材箱);导入图片时,选择是否分层,因为图片从ps编辑时,可能有多个图层;当分层导入时,会比图层数目多一个,是序列;导入序列帧:是以帧为单位的一系列图片,但是直接导入是图片,因此以序列帧格式导入,才能是视频; 导入时,选中第一个,根据命名,电脑会直接识别序列帧,勾选左下脚:“图像序列”;序列帧命名时, 注意位数;07、脱机008 文件序列的创建创建序列,项目右下角 序列_pr基本操作

ORACLE OC4J服务器不支持XFire webservices的解决方案-程序员宅基地

文章浏览阅读63次。为什么80%的码农都做不了架构师?>>> ..._oracle请求xfire内容缺失

JAVA环境变量的配置_"c:\\program files\\java\\jdk1.8.0_212\\bin\\java.-程序员宅基地

文章浏览阅读1.1k次。一:jdk安装版本——1.8.0_171step:默认开发工具,默认文件路劲二:jdk变量三个1_"c:\\program files\\java\\jdk1.8.0_212\\bin\\java.exe\" -xx:tieredstopatlevel=1 -n"

SynchronizedMap和ConcurrentHashMap有什么区别-程序员宅基地

文章浏览阅读734次。SynchronizedMap实现上在调用Map的所有方法是,对整个map进行了同步!public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);}}ConcurrentHashMap的实现却更加精细,他对要操作的桶加锁,而不是整个加锁,所以ConcurrentHashMap在性能..._sequencedhashmap 和 concurrenthashmap 区别是什么

二、SpringBoot2核心功能--04单元测试--01-JUnit5单元测试及其注解-程序员宅基地

文章浏览阅读815次,点赞14次,收藏30次。JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。@Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试。: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。

推荐文章

热门文章

相关标签