向spring容器中加入一下类:用于重写:

<!-- https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter --><dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.19.0</version></dependency><!-- sa-token整合SpringAOP实现注解鉴权 --><dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-aop</artifactId><version>1.19.0</version></dependency>
<!-- JWT --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.8.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version></dependency>
import java.util.Date;import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaTokenConsts;
import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;/*** sa-token集成Jwt** @author Lenovo*/
@Component
public class SaTokenJwtUtil {/*** 秘钥 (随便手打几个字母就好了)*/public static final String BASE64_SECURITY = "79e7c69681b8270162386e6daa53d1dd";/*** token有效期 (单位: 秒)*/public static final long TIMEOUT = 60 * 60 * 2;public static final String LOGIN_ID_KEY = "loginId";/*** 根据userId生成token** @param loginId 账号id* @return jwt-token*/public static String createToken(Object loginId) {// 判断,不可使用默认秘钥
//      if(BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {
//          throw new SaTokenException("请更换秘钥");
//      }// 在这里你可以使用官方提供的claim方法构建载荷,也可以使用setPayload自定义载荷,但是两者不可一起使用JwtBuilder builder = Jwts.builder().setHeaderParam("type", "JWT").claim(LOGIN_ID_KEY, loginId).setIssuedAt(new Date())    // 签发日期.setExpiration(new Date(System.currentTimeMillis() + 1000 * TIMEOUT))  // 有效截止日期.signWith(SignatureAlgorithm.HS256, BASE64_SECURITY.getBytes()); // 加密算法//生成JWTreturn builder.compact();}/*** 从一个jwt里面解析出Claims** @param tokenValue token值* @return Claims对象*/public static Claims getClaims(String tokenValue) {
//      System.out.println(tokenValue);Claims claims = Jwts.parser().setSigningKey(BASE64_SECURITY.getBytes()).parseClaimsJws(tokenValue).getBody();return claims;}/*** 从一个jwt里面解析loginId** @param tokenValue token值* @return loginId*/public static String getLoginId(String tokenValue) {try {Object loginId = getClaims(tokenValue).get(LOGIN_ID_KEY);if (loginId == null) {return null;}return String.valueOf(loginId);} catch (ExpiredJwtException e) {
//          throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.TOKEN_TIMEOUT);return NotLoginException.TOKEN_TIMEOUT;} catch (MalformedJwtException e) {throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.INVALID_TOKEN);} catch (Exception e) {throw new SaTokenException(e);}}static {// 判断秘钥if (BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {String warn = "-------------------------------------\n";warn += "请更换JWT秘钥,不要使用示例默认秘钥\n";warn += "-------------------------------------";System.err.println(warn);}// 修改默认实现StpUtil.stpLogic = new StpLogic("login") {// 重写 (随机生成一个tokenValue)@Overridepublic String createTokenValue(Object loginId) {return SaTokenJwtUtil.createToken(loginId);}// 重写 (在当前会话上登录id )@Overridepublic void setLoginId(Object loginId, SaLoginModel loginModel) {// ------ 1、获取相应对象SaStorage storage = SaManager.getSaTokenContext().getStorage();SaTokenConfig config = getConfig();// ------ 2、生成一个tokenString tokenValue = createTokenValue(loginId);storage.set(splicingKeyJustCreatedSave(), tokenValue);    // 将token保存到本次request里if (config.getIsReadCookie() == true) {    // cookie注入SaManager.getSaTokenContext().getResponse().addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), (int) config.getTimeout());}}// 重写 (获取指定token对应的登录id)@Overridepublic String getLoginIdNotHandle(String tokenValue) {try {return SaTokenJwtUtil.getLoginId(tokenValue);} catch (Exception e) {return null;}}// 重写 (当前会话注销登录)@Overridepublic void logout() {// 如果连token都没有,那么无需执行任何操作String tokenValue = getTokenValue();if (tokenValue == null) {return;}// 如果打开了cookie模式,把cookie清除掉if (getConfig().getIsReadCookie() == true) {SaManager.getSaTokenContext().getResponse().deleteCookie(getTokenName());}}// 重写 (获取指定key的session)@Overridepublic SaSession getSessionBySessionId(String sessionId, boolean isCreate) {throw new SaTokenException("jwt has not session");}// 重写 (获取当前登录者的token剩余有效时间 (单位: 秒))@Overridepublic long getTokenTimeout() {// 如果没有tokenString tokenValue = getTokenValue();if (tokenValue == null) {return SaTokenDao.NOT_VALUE_EXPIRE;}// 开始取值Claims claims = null;try {claims = SaTokenJwtUtil.getClaims(tokenValue);} catch (Exception e) {return SaTokenDao.NOT_VALUE_EXPIRE;}if (claims == null) {return SaTokenDao.NOT_VALUE_EXPIRE;}Date expiration = claims.getExpiration();if (expiration == null) {return SaTokenDao.NOT_VALUE_EXPIRE;}return (expiration.getTime() - System.currentTimeMillis()) / 1000;}// 重写 (返回当前token的登录设备)@Overridepublic String getLoginDevice() {return SaTokenConsts.DEFAULT_LOGIN_DEVICE;}// 重写 (获取当前会话的token信息)@Overridepublic SaTokenInfo getTokenInfo() {SaTokenInfo info = new SaTokenInfo();info.tokenName = getTokenName();info.tokenValue = getTokenValue();info.isLogin = isLogin();info.loginId = getLoginIdDefaultNull();info.loginKey = getLoginKey();info.tokenTimeout = getTokenTimeout();
//              info.sessionTimeout = getSessionTimeout();
//              info.tokenSessionTimeout = getTokenSessionTimeout();
//              info.tokenActivityTimeout = getTokenActivityTimeout();info.loginDevice = getLoginDevice();return info;}};}
}

使用:

import com.alibaba.fastjson.JSON;
import com.example.mindsa.util.UserInfo;
import com.example.mindsa.util.result.AjaxJson;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import cn.dev33.satoken.stp.StpUtil;@RestController
@RequestMapping("/test/")
public class TestJwtController {//登录@RequestMapping("login")public AjaxJson login(@RequestParam(defaultValue = "10001") String id) {UserInfo userInfo = new UserInfo();userInfo.setName("中国好声音");StpUtil.setLoginId(JSON.toJSONString(userInfo));String token = StpUtil.getTokenValue();return AjaxJson.getSuccess(token);}//使用-@RequestMapping("tokenInfo")public AjaxJson tokenInfo() {UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);return AjaxJson.getSuccessData(userInfo);}//使用-如何是第三方跳转登录,可以把token放到Cookie,也可以放到Head头里面@RequestMapping("tokenInfo2")public AjaxJson tokenInfo2(@RequestHeader String satoken) {UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);return AjaxJson.getSuccessData(userInfo);}
}
//手动解析token
public class ApplicationController extends BaseController {static String token = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJsb2dpbklkIjoie1wiZW1haWxcIjpcIlwiLFwibmFtZVwiOm51bGwsXCJvcmdpZFwiOlwiMFwiLFwicGhvbmVcIjpcIlwiLFwidXNlcm5hbWVcIjpcInpoaWh1emhleWVcIn0iLCJpYXQiOjE2MzIyODEyMzAsImV4cCI6MTY2MzgxNzIzMH0.BL9bTTqeWviD4rPD7L_6tygz6Q78fJ7YBTY3yEPuLUA";public static void main(String[] args) {//手动生成tokenString mytoken = SaTokenJwtUtil.createToken("loginId");//手动解析tokenClaims claims = SaTokenJwtUtil.getClaims(token);System.out.println(claims);}}

sa-token集成jwt相关推荐

  1. json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证

    SpringBoot 2.1.4集成JWT实现token验证

  2. SpringBoot集成JWT实现Token登录验证

    目录 1.1 JWT是什么? 1.2 JWT主要使用场景 1.3 JWT请求流程 1.4 JWT结构 二,SpringBoot集成JWT具体实现过程 2.1添加相关依赖 2.2自定义跳出拦截器的注解 ...

  3. SpringBoot集成JWT实现token验证

    Jwt全称是:json web token,以JSON对象的形式安全的传递信息.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过 ...

  4. jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  5. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  6. asp.net core 集成JWT

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  7. 【若依框架】集成JWT

    1.JWT的运用场景: 适用与前后端分离, 适用于对外提供接口时(比如C#要调用Java的后台接口,为了保证接口的安全性,得先拿到token,再发起请求的时候带上token) 2.集成文档说明:(该文 ...

  8. SpringBoot 快速集成 JWT 实现用户登录认证

    前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...

  9. 使用Gin框架集成JWT,源码、详解、面试问题

    使用Gin框架集成JWT,源码.详解.面试问题 一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). ...

最新文章

  1. 在Ubuntu下FFmpeg编译,支持x264和x265(HECV)
  2. 【廖雪峰python入门笔记】while循环
  3. 利用Python进行数据分析(第2版)
  4. 点击Ehlib列标题的快速排序方法
  5. Lambda表达式【转】
  6. java工程师的工作时间_Java 工程师真的每天只需工作四小时吗?
  7. 【机器学习】改善LBP特征提高SVM的可分性的经验总结(一)
  8. 用map实现数据字典功能
  9. 前端学习(2865):公开课封装组件库介绍
  10. 卷积神经网络-目标探测
  11. 一个程序员转产品经理的经验分享
  12. Page Object设计模式实践
  13. 有道难题第一题非OO解,极端记录160ms
  14. Linux串口驱动(8250)的编写与调试
  15. ubuntu下载软件创建桌面快捷方式
  16. 学编程能做什么工作 五大行业任你选
  17. Vmware黑屏解决
  18. 戴尔电脑怎么设置通电自动开机
  19. Android自定义控件之实现快速检索
  20. Warning: Can save best model only with val_acc available, skipping

热门文章

  1. PC党福音,育碧五款游戏大作登场E3 2014
  2. 【学习笔记】系统的松弛线性性、时不变性、因果性
  3. sql语句使数据指数增长
  4. 使用imagemagic生成动态图片GIF
  5. 机器学习科普文章:“一文读懂机器学习,大数据/自然语言处理/算法全有了”
  6. 顺序表前m和后n元素交换位置
  7. ABAP 生产订单的创建与修改函数
  8. 「ZBrush」学习ZB出来可以从事什么工作
  9. 编程真的只是高智商人玩的东西吗?
  10. web下载文件夹的解决方案