jwt生成token和验证token以及获取playload的数据,实现token拦截
jwt实现流程:
1.添加依赖:
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.2.0</version>
</dependency>
2.编写一个jwt的工具类
package com.springboot.jwt.common;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;import java.io.UnsupportedEncodingException;
import java.util.Date;public class JWTUtil {//过期时间设置private static final long EXPIRE_TIME = 5 * 60 * 1000;// private static final long EXPIRE_TIME = 10 * 1000;private static final String SECRET="admintor123service"; //密钥盐/*** 签名验证* @param token* @return*/public static boolean verif(String token) {try {Algorithm algorithm = Algorithm.HMAC256(SECRET);JWTVerifier verifier = JWT.require(algorithm).withIssuer("auth0").build();DecodedJWT jwt = verifier.verify(token);System.out.println("认证通过:");System.out.println("issuer: " + jwt.getIssuer());System.out.println("username: " + jwt.getClaim("username").asString());System.out.println("过期时间: " + jwt.getExpiresAt());return true;} catch (Exception e) {return false;}}/*** @param token* @return*/public static String getUserName(String token) {try {DecodedJWT jwt = JWT.decode(token);return jwt.getClaim("username").asString();} catch (JWTDecodeException e) {return null;}}/*** 签名生成* @param username*/public static String sign(String username) {String token = null;try {Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);Algorithm algorithm = Algorithm.HMAC256(SECRET);token = JWT.create().withIssuer("auth0").withClaim("username", username).withExpiresAt(date).sign(algorithm);return token;} catch (UnsupportedEncodingException e) {return null;}}}
3.JWT中的三个主要方法和三个对象
4.生成token的主要方法:
token = JWT.create().withIssuer(“auth0”).withClaim(“username”, username).withExpiresAt(date).sign(algorithm);
可以看看sign()方法做了什么事情,如下:
5.所以生成token需要三部分数据:
5.1.header:头部(一般不需要处理,主要在sign方法传入算法对象即可)
this.headerClaims.put("alg", algorithm.getName()); this.headerClaims.put("typ", "JWT");
5.2.payload:载体(用于配置基本信息和添加其他信息到token)
//基本信息的方法
public JWTCreator.Builder withKeyId(String keyId) {this.headerClaims.put("kid", keyId);return this;}//jwt发行者public JWTCreator.Builder withIssuer(String issuer) {this.addClaim("iss", issuer);return this;}
//jwt主题public JWTCreator.Builder withSubject(String subject) {this.addClaim("sub", subject);return this;}
//接收jwt的用户public JWTCreator.Builder withAudience(String... audience) {this.addClaim("aud", audience);return this;}
//jwt的过期时间public JWTCreator.Builder withExpiresAt(Date expiresAt) {this.addClaim("exp", expiresAt);return this;}
//在上面时间之前,jwt不可用public JWTCreator.Builder withNotBefore(Date notBefore) {this.addClaim("nbf", notBefore);return this;}
//jwt的发行时间public JWTCreator.Builder withIssuedAt(Date issuedAt) {this.addClaim("iat", issuedAt);return this;}public JWTCreator.Builder withJWTId(String jwtId) {this.addClaim("jti", jwtId);return this;}
//添加其他信息的方法public JWTCreator.Builder withClaim(String name, Boolean value) throws IllegalArgumentException {this.assertNonNull(name);this.addClaim(name, value);return this;}
5.3.signature:签名(不需要处理,内部方法处理)
签名的生成是由头部数据和载体数据通过算法生成的签名数据。
byte[] signatureBytes = this.algorithm.sign(content.getBytes(StandardCharsets.UTF_8));
String signature = Base64.encodeBase64URLSafeString(signatureBytes);
6.从token中获取payload载体的数据,通过JWT.decode(token)获取DecodeJWT对象。
public static String getUserName(String token) {try {DecodedJWT jwt = JWT.decode(token);return jwt.getClaim("username").asString();} catch (JWTDecodeException e) {return null;}}
说明:
主要通过DecodeJWT对象的getClaim方法获取。chaim对象是一个map,getClaim()就是调用map的get()方法。
7.jwt验证token的载体数据,如果载体的数据与生成token时的载体数据能匹配上,接口的请求就通过,否则不通过,通过拦截器来实现拦截。具体实现如下:
说明:
主要通过JWTVerifier验证器的verify()方法来验证token。
public static boolean verif(String token) {try {Algorithm algorithm = Algorithm.HMAC256(SECRET);JWTVerifier verifier = JWT.require(algorithm).withIssuer("auth0").build();DecodedJWT jwt = verifier.verify(token);return true;} catch (Exception e) {return false;}}
看看verify(token)方法做了什么,如下: 说明: 主要验证算法对象,签名,和Claim的数据(也就是payload载体的数据)
6.1验证算法对象
6.2验证签名
6.3Claim的数据(也就是payload载体的数据)
7.自定义拦截器TokenInterceptor.java,在拦截器中进行token的验证。
package com.springboot.jwt.common.intercepter;import com.fasterxml.jackson.databind.ObjectMapper;
import com.springboot.jwt.common.JWTUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;@Component
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if(request.getMethod().equals("OPTIONS")){response.setStatus(HttpServletResponse.SC_OK);return true;}String token = request.getHeader("token");if(token !=null){boolean result = JWTUtil.verif(token);if(result){return true;}}response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");PrintWriter out = null;try{Map map = new HashMap<String,Object>();map.put("success", false);map.put("msg", "认证失败,未通过拦截器");response.getWriter().write(new ObjectMapper().writeValueAsString(map));}catch (Exception e){e.printStackTrace();response.sendError(500);return false;}return false;}}
8.在webmvcconfig中,通过重写addInterceptors(InterceptorRegistry registry)方法,注册自定义的过滤器:
package com.springboot.jwt.common.config;import com.springboot.jwt.common.intercepter.TokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.ArrayList;
import java.util.List;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {/* private TokenInterceptor tokenInterceptor;//构造方法public InterceptorConfig(TokenInterceptor tokenInterceptor){this.tokenInterceptor =tokenInterceptor;}*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> excludePath = new ArrayList<>();excludePath.add("/login");//登录excludePath.add("/register");//注册excludePath.add("/logout");//登出excludePath.add("/static/**"); //静态资源excludePath.add("/assets/**"); //静态资源registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**").excludePathPatterns(excludePath);// WebMvcConfigurer.super.addInterceptors(registry);}
}
jwt生成token和验证token以及获取playload的数据,实现token拦截相关推荐
- token登录验证机制
jwt: json web token 数据 前端 秘钥 前端 请求数据的时候. 需要通过秘钥生成命令令牌. Token token是oAuth Token,提供的是认证和授权,认证针对用户,授权是针 ...
- java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
GitHub源码地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git 封装JTW生成token和校验方法 public class ...
- JWT生成token与中间件验证
一.安装JWT扩展 建议使用composer安装 方便 快捷,切到项目目录下运行以下命令 composer require firebase/php-jwt 二.使用 生成token ,这里是把用户u ...
- Java Token登录验证 使用jjwt生成和解析JWT
Java jjwt生成和解析Token 参考 依赖 流程 生成和解析Jwt 生成jwt 解析Jwt 实例 后端 前端 刚学会了点使用Jwt来验证登录,记录下来 参考 JSON Web Tokens官网 ...
- JWT生成token和验证的简单实现
给客户提供数据接口时,要求使用jwt生成token实现token认证 首先引入依赖: <!-- JWT --> <dependency><groupId>com.a ...
- JWT生成Token做登录校验讲解
Free码农 2017-12-28 00:08:02 JWT简介 JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. JWT的声明一般被用来在身份 ...
- SpringBoot集成JWT实现Token登录验证
目录 1.1 JWT是什么? 1.2 JWT主要使用场景 1.3 JWT请求流程 1.4 JWT结构 二,SpringBoot集成JWT具体实现过程 2.1添加相关依赖 2.2自定义跳出拦截器的注解 ...
- java token生成和验证_Java Token登录验证 生成解析Token
借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
JWT简介 JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从 ...
最新文章
- Spark安装与学习
- 一个write和printf混用的例子
- 计算机要学打字吗,有了电脑打字,还需要练字吗?
- 《网络管理员考试案例梳理、真题透解与强化训练》复习重点
- [MEGA DEAL]专家级Java捆绑包新手(96%)
- 如何对第一个Vue.js组件进行单元测试
- Jquery 实现原理之 Ajax
- 均方根误差有没有单位_装载机电子秤的功能特点以及误差的解决办法
- SQL Server中的身份功能教程
- 拓端tecdat|R平方/相关性取决于预测变量的方差
- STM32G030C8T6跑马灯程序V0.2(四)
- 《Java性能优化权威指南》读书笔记
- 供应链业务架构设计概览
- 蛋白质组学两个定量方法(iBAQ和LFQ)的区别及常见的标准化方法
- 计算机用word做海报,如何使用word文档制作精美海报
- win10查看无线密码
- Thumbnails压缩图片
- 图像处理-图像边缘处理
- 微信小程序图片懒加载(lazy-load,感觉不生效)
- 什么专业要学计算机思维导论,大学计算机:计算思维导论CAP
热门文章
- aspnetdb.mdb数据库介绍
- 如何有效的制定团队能力提升计划?
- 将Windows XP 中文版变为英文版
- RESTFUL概念,什么是RESTFUL
- 打开损坏的Word文档-word修复_目前只用过打开并修复
- keybindings.json
- ios中safari浏览器100vh带有滚动条?
- Nico的刷题日记(三)
- 已定义了两个整数变量A和B,完成下列功能: (1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中(2)若两个数均为奇数,则将两数均加1后存入原变量(3)若两个数均为偶数,则两个变量均不改变。
- 解读:LED照明设备出口沙特需要什么认证?法规要求!