本文源码: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跨域验证问题的更多相关文章

  1. (十)整合 JWT 框架,解决Token跨域验证问题

    整合 JWT 框架,解决Token跨域验证问题 1.传统Session认证 1.1 认证过程 1.2 存在问题 2.JWT简介 2.1 认证流程 2.2 JWT结构说明 2.3 JWT使用方式 3.S ...

  2. SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...

  3. SpringBoot2.0 整合 Shiro 框架,实现用户权限管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Shiro简介 1.基础概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.作为一款安全 ...

  4. SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Security简介 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方 ...

  5. SpringBoot2.0 整合 ElasticSearch框架,实现高性能搜索引擎

    本文源码:GitHub·点这里 || GitEE·点这里 一.安装和简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful ...

  6. hprose 1.0(rpc 框架) - 关于跨域和P3P的声明

    private function sendHeader($context) { if ($this->onSendHeader !== null) { $sendHeader = $this-& ...

  7. SpringBoot2.0+Shiro+JWT 整合

    SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编 ...

  8. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  9. SpringBoot2.0 整合 Redis集群 ,实现消息队列场景

    本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...

随机推荐

  1. django生命周期请求l流程图

    django思维导图链接:https://www.processon.com/view/link/5dddb0f8e4b074c442e5c68c

  2. 《Dotnet9》系列-开源C# WPF控件库1《MaterialDesignInXAML》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  3. STT-MRMA技术优点

    到目前为止,设计人员可以使用的存储技术是易变的,这意味着在断电后,存储器中的数据内容会丢失.但是,随着Everspin Technologies推出256Mb STT-MRAM,系统现在可以拥有像DR ...

  4. k8s~k8s里的服务Service

    k8s用命名空间namespace把资源进行隔离,默认情况下,相同的命名空间里的服务可以相互通讯,反之进行隔离. 服务Service 1.1 Service Kubernetes中一个应用服务会有一个 ...

  5. MySQL Event历史记录

    需求 SQL Server的作业历史(Job)记录是保存在msdb库中的,很方便就查询相关的Job定义,计划和历史记录,而MySQL的event却没有历史记录.为方便查看event是否正常执行以及执行 ...

  6. CentOS 上配置 lua 的服务器环境(enet)

    安装 lua & luarocket 安装依赖 $ yum install gcc gcc-c++ kernel-devel $ yum install readline-dev $ yum ...

  7. 对于prim的一个有趣但有点奇怪的想法

    prim算法找最小生成树适用于无向图,对于有向加权图会产生错误. 比如 1->2,8 1->3,8 2->3,4 3->2,3 最小生成树1->2->3 而不是3- ...

  8. Git多个远程仓库不同步时的补救办法

    git本地仓库是可以与多个远程仓库关联的,如果想知道怎么配置,请参考Git如何使用多个托管平台管理代码 . 当git remote关联了多个远程仓库时,总会遇到一些问题.今天就遇到了两个远程仓库不一致 ...

  9. Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面

    In this lesson, you will learn how to enable/disable the Ribbon User Interface in your application. ...

  10. C lang: Pointer

    Ax_Terminology xa_pointer pointer is the address used to store the variable;A variable (or data obje ...