文章目录
前言
本文介绍了Cookie,Session,JWT,过滤器,拦截器的相关知识
一、Cookie和Session
浏览器请求头携带Cookie;
服务器响应头Set-Cookie;
进行会话跟踪。
但是移动端APP,用户禁用,跨域情况下,Cookie失效。
跨域:协议、IP/域名、端口不一样,前端请求时,出现跨域
Session:
浏览器请求头的Cookie中携带JSessionId;
服务器响应头的Cookie中有JSessionId
服务器集群需要处理Session共享的问题
二、JWT
1.三部分
分为以下三个部分,Header和PayLoad使用Base64编码
Header:存储令牌类型,加密算法。比如{“alg”: “HS256”, “type”: “JWT”}
PayLoad :Json格式的数据。比如:{“userId”: 1}
Signature: 签名,对Header,PayLoad根据加密算法进行加密
2.使用
pom.xml引入依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
JWT加解密单元测试:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtTest {
@Test
public void testBuildJwt(){
Map<String, Object> claims = new HashMap<>();
claims.put("username", "zhangsan");
claims.put("job", "developer");
String compact = Jwts.builder()
//设置有效载荷
.setClaims(claims)
//设置签名
.signWith(SignatureAlgorithm.HS256, "123456")
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7))
.compact();
System.out.println(compact);
}
@Test
public void testParseJwt(){
Claims body = Jwts.parser()
.setSigningKey("123456")
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJqb2IiOiJkZXZlbG9wZXIiLCJleHAiOjE3MTMzMjE0MjQsInVzZXJuYW1lIjoiemhhbmdzYW4ifQ.R9H8nncSCooaffujgxlCk3vuikkE-sH9j8ATGWQu-y8")
.getBody();
System.out.println(body);
}
}
3.另外一种使用
3.1引入依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
3.1 定义工具类
定义配置文件类,这里定义配置文件中,前缀为jwt,变量名称成secret的变量。
配置文件中配置:jwt.secret=xxx
package