JWT操作工具类分享

分享个人操作的JWT的工具类,基于jjwt库,这是Java圈子中最流行的JWT操作库。

文章目录

          • 一、应用场景
          • 二、实战案例
            • 1. jjwt 开源地址
            • 2. 加依赖
            • 3. 工具类
            • 4. 写配置
            • 5. 使用
          • 三、企业需求

一、应用场景

给用户不敏感信息生成token,作为用户登陆的唯一标识,访问后端都必须携带token,也就是说,后端处理前端请求时会先判断token是否合法,不合法直接响应状态码;合法正常处理请求。

前后端分离项目采用session 和cookie即可,前后端分离场景:建议采用token,因为有了跨域问题。

二、实战案例
1. jjwt 开源地址

GIthub:https://github.com/jwtk/jjwt

2. 加依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.1</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.1</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --><version>0.11.1</version><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency>
3. 工具类
package com.itmuch.usercenter.util;import com.google.common.collect.Maps;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Slf4j
@RequiredArgsConstructor
@SuppressWarnings("WeakerAccess")
@Component
public class JwtOperator {/*** 秘钥* - 默认aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt*/@Value("${secret:aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt}")private String secret;/*** 有效期,单位秒* - 默认2周*/@Value("${expire-time-in-second:1209600}")private Long expirationTimeInSecond;/*** 从token中获取claim** @param token token* @return claim*/public Claims getClaimsFromToken(String token) {try {return Jwts.parser().setSigningKey(this.secret.getBytes()).parseClaimsJws(token).getBody();} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | IllegalArgumentException e) {log.error("token解析错误", e);throw new IllegalArgumentException("Token invalided.");}}/*** 获取token的过期时间** @param token token* @return 过期时间*/public Date getExpirationDateFromToken(String token) {return getClaimsFromToken(token).getExpiration();}/*** 判断token是否过期** @param token token* @return 已过期返回true,未过期返回false*/private Boolean isTokenExpired(String token) {Date expiration = getExpirationDateFromToken(token);return expiration.before(new Date());}/*** 计算token的过期时间** @return 过期时间*/public Date getExpirationTime() {return new Date(System.currentTimeMillis() + this.expirationTimeInSecond * 1000);}/*** 为指定用户生成token** @param claims 用户信息* @return token*/public String generateToken(Map<String, Object> claims) {Date createdTime = new Date();Date expirationTime = this.getExpirationTime();byte[] keyBytes = secret.getBytes();SecretKey key = Keys.hmacShaKeyFor(keyBytes);return Jwts.builder().setClaims(claims).setIssuedAt(createdTime).setExpiration(expirationTime)// 你也可以改用你喜欢的算法// 支持的算法详见:https://github.com/jwtk/jjwt#features.signWith(key, SignatureAlgorithm.HS256).compact();}/*** 判断token是否非法** @param token token* @return 未过期返回true,否则返回false*/public Boolean validateToken(String token) {return !isTokenExpired(token);}//    public static void main(String[] args) {
//        // 1. 初始化
//        JwtOperator jwtOperator = new JwtOperator();
//        jwtOperator.expirationTimeInSecond = 1209600L;
//        jwtOperator.secret = "aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt";
//
//        // 2.设置用户信息
//        HashMap<String, Object> objectObjectHashMap = Maps.newHashMap();
//        objectObjectHashMap.put("id", "1");
//
//        // 测试1: 生成token
//        String token = jwtOperator.generateToken(objectObjectHashMap);
//        // 会生成类似该字符串的内容: eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk4MTcsImV4cCI6MTU2Njc5OTQxN30.27_QgdtTg4SUgxidW6ALHFsZPgMtjCQ4ZYTRmZroKCQ
//        System.out.println(token);
//
//        // 将我改成上面生成的token!!!
//        String someToken = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1OTQ1NjIsImV4cCI6MTU2NjgwNDE2Mn0.PAvWPcQAZnSlYKNbZr4O1l9aA4LPphuq0OG2QIs7O5E\n";
//        // 测试2: 如果能token合法且未过期,返回true
//        Boolean validateToken = jwtOperator.validateToken(someToken);
//        System.out.println(validateToken);
//
//        // 测试3: 获取用户信息
//        Claims claims = jwtOperator.getClaimsFromToken(someToken);
//        System.out.println(claims);
//
//        // 将我改成你生成的token的第一段(以.为边界)
//        String encodedHeader = "eyJhbGciOiJIUzI1NiJ9";
//        // 测试4: 解密Header
//        byte[] header = Base64.decodeBase64(encodedHeader.getBytes());
//        System.out.println(new String(header));
//
//        // 将我改成你生成的token的第二段(以.为边界)
//        String encodedPayload = "eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk1NDEsImV4cCI6MTU2Njc5OTE0MX0";
//        // 测试5: 解密Payload
//        byte[] payload = Base64.decodeBase64(encodedPayload.getBytes());
//        System.out.println(new String(payload));
//
//        // 测试6: 这是一个被篡改的token,因此会报异常,说明JWT是安全的
//        jwtOperator.validateToken("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk3MzIsImV4cCI6MTU2Njc5OTMzMn0.nDv25ex7XuTlmXgNzGX46LqMZItVFyNHQpmL9UQf-aUxxx");
//    }
}
4. 写配置
jwt:secret: aaaaaaabbbbbbcccccdddddaaaaaaabbbbbbcccccdddddaaaaaaabbbbbbcccccddddd# 有效期,单位秒,默认2周expire-time-in-second: 1209600
5. 使用
 @Autowiredprivate final JwtOperator jwtOperator;
三、企业需求

1.首先写一个拦截器,拦截前端的所有请求
2.获取请求头部header中的token是否合法
1>合法正常处理请求
2>不合法抛出自定义异常和状态码

问题1:
为什么是自定义异常?

释义:
由于不能讲控制台的异常直接抛出到前端页面,这样不友好,定义全局异常处理类,根据需求自定义异常信息和状态码。
例如:token不合法,状态码是401

private void checkToken() {try {// 1. 从header里面获取tokenHttpServletRequest request = getHttpServletRequest();String token = request.getHeader("X-Token");// 2. 校验token是否合法&是否过期;如果不合法或已过期直接抛异常;如果合法放行Boolean isValid = jwtOperator.validateToken(token);if (!isValid) {throw new SecurityException("Token不合法!");}// 3. 如果校验成功,那么就将用户的信息设置到request的attribute里面Claims claims = jwtOperator.getClaimsFromToken(token);request.setAttribute("id", claims.get("id"));request.setAttribute("wxNickname", claims.get("wxNickname"));request.setAttribute("role", claims.get("role"));} catch (Throwable throwable) {throw new SecurityException("Token不合法");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器zip解压php,服务器端解压缩zip的脚本

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">文件解压缩管理// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead// of $_FILES.if (isset($_POST…

阿里研究员谷朴:API 设计最佳实践的思考

API是软件系统的核心&#xff0c;而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素。但复杂度Complexity并非某一个单独的问题能完全败坏的&#xff0c;而是在系统设计尤其是API设计层面很多很多小的设计考量一点点叠加起来的&#xff08;也即John Ousterhou…

sonar扫描脚本

vim DynamicStartSonarShell.sh添加内容如下&#xff1a; #!/bin/bash #su - $1 -s /bin/bash /app/CodeQualityScan/$2/sonar-scanner.sh su - $1 <<EOF cd /app/CodeQualityScan/$2/; ./sonar-scanner.sh exit; EOF赋予可执行权限&#xff1a; chmod ux DynamicStartSo…

linux php 添加gd,linux(centos)下为php添加添加GD扩展

标签&#xff1a;inux type lib eve MIP 依赖库 重启nginx nginx linuxyum -y install libjpeglibjpeg-devel libpng libpng-devel freetype freetype-devel 安装依赖库yum -y install libjpeg-devel1.首先切换到php源码目录&#xff1a;/usr/local/php-5.6.29…

2018年深度学习的主要进步

在过去几年中&#xff0c;深度学习改变了整个人工智能的发展。深度学习技术已经开始在医疗保健&#xff0c;金融&#xff0c;人力资源&#xff0c;零售&#xff0c;地震检测和自动驾驶汽车等领域的应用程序中出现。至于现有的成果表现也一直在稳步提高。 在学术层面&#xff0…

大横琴科技联合阿里云发布全国首个跨境服务创新平台琴澳通

12月3日&#xff0c;阿里云广东峰会期间&#xff0c;大横琴科技公司联合阿里云发布了全国首个跨境服务创新平台。基于该平台&#xff0c;全国首个跨境服务APP“琴澳通”也正式发布。“琴澳通”将为澳门企业及个人提供服务&#xff0c;推动澳门和广东两地的产业经济联动&#xf…

各类监督方法流行趋势分析

又到一年的年末了&#xff0c;到了进行总结并展望来年的时候了&#xff0c;在这里预祝各位新的一年顺利。闲话少叙&#xff0c;本文将对有监督学习方法进行总结。 机器学习领域在过去几十年中经历了巨大的变化&#xff0c;不可否认的是&#xff0c;虽然有些方法已经存在了很长…

php dom 换行,PHP DOM XML不会在标记之后打印掉换行符

所以我的问题是&#xff0c;当我使用php XML DOM解析器保存时&#xff0c;我的xml文件中的标签没有正确格式化&#xff0c;后面有换行符。$xdoc new DOMDocument();$xdoc->formatOutput true;$xdoc->preserveWhiteSpace false;$xdoc->load($file);$new_topic$xdoc-…

2018年度机器学习50大热门网文

新的一年新气象&#xff0c;总结过去一年&#xff0c;展望新的一年。站在巨人的肩膀上前行&#xff0c;肯定会事半功倍。因此&#xff0c;本文从2018年1月至12月期间挑选出近22,000篇机器学习文章&#xff0c;并进行比较&#xff0c;以挑选出能够提升2019年数据科学技能的前50名…

广东制造按下加速键  千家中小企业上阿里云工业互联网

阿里云广东峰会上&#xff0c;阿里巴巴副总裁、阿里云智能IoT事业部总经理库伟表示&#xff0c;过去2年阿里云与合作伙伴一起助力数千家广东中小企业的数字化转型综合成本降低了70%。 都说中国制造看广东&#xff0c;云计算、物联网、人工智能已成为广东制造发展新引擎。“我们…

阿里云图数据库GraphDB上线,助力图数据处理

GraphDB简介 GraphDB图数据库适用于存储&#xff0c;管理&#xff0c;查询复杂并且高度连接的数据&#xff0c;图库的结构特别适合发现大数据集下数据之间的共性和特性&#xff0c;特别善于释放蕴含在数据关系之间的巨大价值。GraphDB引擎本身并不额外收费&#xff0c;仅收取云…

pom 导入mysql连接,maven项目中的jdbc连接步骤

在maven项目pom.xml中到入驱动包(以下是驱动包代码)mysqlmysql-connector-java8.0.15导入成功会看到Maven Dependencies下有个mysql-connector-Java包然后按下面步骤&#xff1a;package com.base.day16;import java.sql.Connection;import java.sql.DriverManager;import java…

一场稳定、高清、流畅的大型活动直播是怎么炼成的?

双11猫晚是家喻户晓的综艺晚会&#xff0c;在今年的双11&#xff0c;阿里集团为2500万用户提供了一场在线直播视觉盛宴。网友评价这是一场既稳定流畅又高清的直播&#xff0c;当然在这背后离不开阿里云的技术支持。 本次天猫晚会中&#xff0c;视频云首次采用4k和50帧的技术&a…

阿里云联合顶级卫星影像公司发布数字地球引擎

12月3日&#xff0c;在阿里云广东峰会上&#xff0c;阿里云联合超图软件、长光卫星、Maxar技术、四维测绘等顶级卫星影像产业链公司发布数字地球引擎&#xff0c;提供开放式的影像数据集、遥感AI能力、丰富的API接口等&#xff0c;在国土资源监管、水利河道治理、自然环境保护和…

PLSQL 快捷键

文章目录1.创建文本文件2. 添加自定义快捷键3. 配置1.创建文本文件 在D:\software\PLSQL Developer\PlugIns目录下面创建shortcuts.txt 2. 添加自定义快捷键 iINSERT uUPDATE sSELECT fFROM wWHERE oORDER BY dDELETE dfDELETE FROM sfSELECT * FROM scSELECT COUNT(*) FROM…

python numpy sum函数,numpy.sum()的使用详解

numpy的sum函数可接受的参数是:sum(a, axisNone, dtypeNone, outNone, keepdimsnp._NoValue)在参数列表中&#xff1a;a是要进行加法运算的向量/数组/矩阵axis的值可以为None,也可以为整数和元组其形参的注释如下:a : array_like elements to sum.a&#xff1a;用于进行加法运算…

云栖专辑 | 阿里开发者们的第9个感悟:脱离产品价值,是难以出创造性的代码的

2015年12月20日&#xff0c;云栖社区上线。2018年12月20日&#xff0c;云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来&#xff0c;寒冬中&#xff0c;最值得投资的是学习&#xff0c;是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…