目录
会话技术
会话 打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求与响应
会话跟踪 一种维护浏览器的方法 服务器需要识别多次请求是否来自于同一浏览器 以便在同一次会话的多次请求间共享数据
会话跟踪方案
客户端会话跟踪技术 Cookie
服务端会话跟踪技术 Session
令牌技术
Cookie
优点 HTTP协议中支持的技术
缺点 移动端App无法使用Cookie
不安全,用户可以自己禁用Cookie
Cookie不能跨域(跨域 : 协议,IP/域名,端口中有不同的)
@Slf4j
@RestController
public class SessionController {
@GetMapping("/c1")
public Result cookie1(HttpServletResponse response){
response.addCookie(new Cookie("login_username","awaw"));
return Result.success();
}
@GetMapping("/c2")
public Result cookie2(HttpServletRequest request){
Cookie[]cookies = request.getCookies();
for(Cookie cookie : cookies){
if(cookie.getName() == "login_username" ){
System.out.println("login_username" + cookie.getValue());
}
}
return Result.success();
}
}
Session
优点 存储在服务器 安全
缺点 服务器集群情况下无法直接使用Session
移动端App无法使用Session
不安全,用户可以自己禁用Session
Session不能跨域
@Slf4j
@RestController
public class SessionController {
@GetMapping("/s1")
public Result session1(HttpSession session){
log.info("HttpSession-s2:{}",session.hashCode());
session.setAttribute("loginUser","tom");
return Result.success();
}
@GetMapping("/s2")
public Result session2(HttpServletRequest request){
HttpSession session = request.getSession();
log.info("HttpSession-s2{}:",session.hashCode());
Object loginUser = session.getAttribute("loginUser");
log.info("loginUser: {}",loginUser);
return Result.success(loginUser);
}
}
JWT
Json Web Token
定义了一种简洁的,自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的
组成
第一部分 header 头:记录令牌类型,签名算法等
第二部分 Payload 有效载荷:携带一些自定义信息,默认信息等
第三部分 Signature 签名:防止Token被修改,确保安全性。将header,Payload加入执行密匙,通过指定签名算法计算而来
优点
支持PC端,移动端
解决集群问题下的认证问题
减轻服务器存储压力
在pom.xml中引入JWT令牌依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
JWT生成
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testGenJwt(){
Map<String,Object>claims = new HashMap<>();
claims.put("id",1);
claims.put("name","tom");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256,"awaw")//签名算法
.setClaims(claims)//自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 10000))//有效期
.compact();
System.out.println(jwt);
}
}
JWT校验
JWT检验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testParseJwt(){
Claims claims = Jwts.parser()
.setSigningKey("awaw")//指定签名密匙
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwNDY0NjU4OH0.EKF6hnJvMExOBaJHE71OZmQBN0Sbcc3sH9FHkBq8sDY")//解析令牌
.getBody();
System.out.println(claims);
}
}