SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题
本文源码:GitHub·点这里 || GitEE·点这里
一、传统Session认证
1、认证过程
1、用户向服务器发送用户名和密码。
2、服务器验证后在当前对话(session)保存相关数据。
3、服务器向返回sessionId,写入客户端 Cookie。
4、客户端每次请求,需要通过 Cookie,将 sessionId 回传服务器。
5、服务器收到 sessionId,验证客户端。
2、存在问题
1、session保存在服务端,客户端访问高并发时,服务端压力大。
2、扩展性差,服务器集群,就需要 session 数据共享。
二、JWT简介
JWT(全称:JSON Web Token),在基于HTTP通信过程中,进行身份认证。
1、认证流程
1、客户端通过用户名和密码登录服务器;
2、服务端对客户端身份进行验证;
3、服务器认证以后,生成一个 JSON 对象,发回客户端;
4、客户端与服务端通信的时候,都要发回这个 JSON 对象;
5、服务端解析该JSON对象,获取用户身份;
6、服务端可以不必存储该JSON(Token)对象,身份信息都可以解析出来。
2、JWT结构说明
抓一只鲜活的Token过来。
{
"msg": "验证成功",
"code": 200,
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.
eyJzdWIiOiJhZG1pbiIsImlhdCI6iZEIj3fQ.
uEJSJagJf1j7A55Wwr1bGsB5YQoAyz5rbFtF"
}
上面的Token被手动格式化了,实际上是用"."分隔的一个完整的长字符串。
JWT结构
1、头部(header) 声明类型以及加密算法;
2、负载(payload) 携带一些用户身份信息;
3、签名(signature) 签名信息。
3、JWT使用方式
通常推荐的做法是客户端在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer <token>
服务端获取JWT方式
String token = request.getHeader("token");
三、与SpringBoot2整合
1、核心依赖文件
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
2、配置文件
server:
port: 7009
spring:
application:
name: ware-jwt-token
config:
jwt:
# 加密密钥
secret: iwqjhda8232bjgh432[cicada-smile]
# token有效时长
expire: 3600
# header 名称
header: token
3、JWT配置代码块
@ConfigurationProperties(prefix = "config.jwt")
@Component
public class JwtConfig {
/*
* 根据身份ID标识,生成Token
*/
public String getToken (String identityId){
Date nowDate = new Date();
//过期时间
Date expireDate = new Date(nowDate.getTime() + expire * 1000);
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.setSubject(identityId)
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
/*
* 获取 Token 中注册信息
*/
public Claims getTokenClaim (String token) {
try {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
/*
* Token 是否过期验证
*/
public boolean isTokenExpired (Date expirationTime) {
return expirationTime.before(new Date());
}
private String secret;
private long expire;
private String header;
// 省略 GET 和 SET
}
四、Token拦截案例
1、配置Token拦截器
@Component
public class TokenInterceptor extends HandlerInterceptorAdapter {
@Resource
private JwtConfig jwtConfig ;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 地址过滤
String uri = request.getRequestURI() ;
if (uri.contains("/login")){
return true ;
}
// Token 验证
String token = request.getHeader(jwtConfig.getHeader());
if(StringUtils.isEmpty(token)){
token = request.getParameter(jwtConfig.getHeader());
}
if(StringUtils.isEmpty(token)){
throw new Exception(jwtConfig.getHeader()+ "不能为空");
}
Claims claims = jwtConfig.getTokenClaim(token);
if(claims == null || jwtConfig.isTokenExpired(claims.getExpiration())){
throw new Exception(jwtConfig.getHeader() + "失效,请重新登录");
}
//设置 identityId 用户身份ID
request.setAttribute("identityId", claims.getSubject());
return true;
}
}
2、拦截器注册
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private TokenInterceptor tokenInterceptor ;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");
}
}
3、测试接口代码
@RestController
public class TokenController {
@Resource
private JwtConfig jwtConfig ;
// 拦截器直接放行,返回Token
@PostMapping("/login")
public Map<String,String> login (@RequestParam("userName") String userName,
@RequestParam("passWord") String passWord){
Map<String,String> result = new HashMap<>() ;
// 省略数据源校验
String token = jwtConfig.getToken(userName+passWord) ;
if (!StringUtils.isEmpty(token)) {
result.put("token",token) ;
}
result.put("userName",userName) ;
return result ;
}
// 需要 Token 验证的接口
@PostMapping("/info")
public String info (){
return "info" ;
}
}
五、源代码地址
GitHub地址:知了一笑
https://github.com/cicadasmile/middle-ware-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/middle-ware-parent
SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题的更多相关文章
- (十)整合 JWT 框架,解决Token跨域验证问题
整合 JWT 框架,解决Token跨域验证问题 1.传统Session认证 1.1 认证过程 1.2 存在问题 2.JWT简介 2.1 认证流程 2.2 JWT结构说明 2.3 JWT使用方式 3.S ...
- SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...
- SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Shiro简介 1.基础概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.作为一款安全 ...
- SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Security简介 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方 ...
- SpringBoot2.0 整合 ElasticSearch框架,实现高性能搜索引擎
本文源码:GitHub·点这里 || GitEE·点这里 一.安装和简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful ...
- hprose 1.0(rpc 框架) - 关于跨域和P3P的声明
private function sendHeader($context) { if ($this->onSendHeader !== null) { $sendHeader = $this-& ...
- SpringBoot2.0+Shiro+JWT 整合
SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编 ...
- SpringBoot2.0 整合 QuartJob ,实现定时器实时管理
一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...
- SpringBoot2.0 整合 Redis集群 ,实现消息队列场景
本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...
随机推荐
- eclipse 代码问题总结
隐藏控件,在xml文件中写属性 android:visibility="gone"
- Brett Beauregard大神的Arduino PID算法
大神的全部PID http://brettbeauregard.com/blog/category/pid/ Improving the Beginner’s PID – Introduction I ...
- Sockit 硬件接口编程——点亮一个LED
1.话不多说上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- oracle中的分组排序
1.首先,需要建表. 表名:coursr(失误,表名写错了) 2.我们需要对每个课程进行排序. 3.知识准备: 分组排序函数有3种: row_number() over() rank() over() ...
- Jupyter 快捷键总结
转载自https://www.cnblogs.com/hello-alan/p/11376325.htmlJupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本: ...
- python 多线程编程之使用进程和全局解释器锁GIL
本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...
- ObjectPool 对象池设计模式
Micosoft.Extension.ObjectPool 源码架构.模式分析: 三大基本对象: ObjectPool抽象类 ObjectPoolProvider抽象类 IPooledObjectPo ...
- Linux下的密码破解
密码散列: 密码散列的$6 表示是:SHA512 这里我们使用hashcat 工具进行破解 ╰─ hashcat -m 1800 hash.txt /usr/share/wordlists/rocky ...
- adb shell常用命令
一.文件操作相关命令 1.文件操作命令 子命令 参数 说明 cd 无 进入目录 cat [-beflnstuv] [-B bsize] [file...] 查看文件内容-n:显示行号-b:显示行号,但 ...
- Hadoop_HDFS_02
1. HDFS入门 1.1 HDFS基本概念 HDFS是Hadoop Distribute File System的简称, 意为: Hadoop分布式文件系统. 是Hadoop三大核心组件之一, 作为 ...