1.如果通过令牌技术来跟踪会话,我们就可以在浏览器发起请求。在请求登录接口的时候,如果登录成 功,我就可以生成一个令牌,令牌就是用户的合法身份凭证。接下来我在响应数据的时候,我就可以直 接将令牌响应给前端。
1.接下来我们在前端程序当中接收到令牌之后,就需要将这个令牌存储起来。这个存储可以存储在
cookie
当中,也可以存储在其他的存储空间
(
比如:
localStorage)
当中。
接下来,在后续的每一次请求当中,都需要将令牌携带到服务端。携带到服务端之后,接下来我们就需要来校验令牌的有效性。如果令牌是有效的,就说明用户已经执行了登录操作,如果令牌是无效的,就 说明用户之前并未执行登录操作。 此时,如果是在同一次会话的多次请求之间,我们想共享数据,我们就可以将共享的数据存储在令牌当 中就可以了。
优缺点
优点:
支持
PC
端、移动端
解决集群环境下的认证问题
减轻服务器的存储压力(无需在服务器端存储)
缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)
<!-- JWT
依赖
-->
<dependency>
<groupId>
io.jsonwebtoken
</groupId>
<artifactId>
jjwt
</artifactId>
<version>
0.9.1
</version>
</dependency>
生成
JWT
代码实现:
@Test
public
void
genJwt
(){
Map
<
String
,
Object
>
claims
=
new
HashMap
<>
();
claims
.
put
(
"id"
,
1
);
claims
.
put
(
"username"
,
"Tom"
);
String
jwt
=
Jwts
.
builder
()
.
setClaims
(
claims
)
//
自定义内容
(
载荷
)
.
signWith
(
SignatureAlgorithm
.
HS256
,
"itheima"
)
//
签名算法
.
setExpiration
(
new
Date
(
System
.
currentTimeMillis
()
+
24
*
3600
*
1000
))
//
有效期
.
compact
();
System
.
out
.
println
(
jwt
);
实现了
JWT
令牌的生成,下面我们接着使用
Java
代码来校验
JWT
令牌
(
解析生成的令牌
)
:
@Test
public
void
parseJwt
(){
Claims claims
=
Jwts
.
parser
()
.
setSigningKey
(
"itheima"
)
//
指定签名密钥(必须保证和生成令牌时使用
相同的签名密钥)
.
parseClaimsJws
(
"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjcyNzI5NzMw
fQ.fHi0Ub8npbyt71UqLXDdLyipptLgxBUg_mSuGJtXtBk"
)
.
getBody
();
System
.
out
.
println
(
claims
);
}