1.前言
浏览器与服务器之间的一次连接,我们就称为一次会话,用户打开浏览器第一次访问服务器的时候,这个会话就建立了,直到有任何一方断开连接,此时会话就结束了。在一次会话当中,是可以包含多次请求和响应的。常见的会话技术有Cookie,Session,JWT.
2.Cookie
-
优点:HTTP协议中支持的技术
-
缺点:
-
移动端APP(Android、IOS)中无法使用Cookie
-
不安全,用户可以自己禁用Cookie
-
Cookie不能跨域
-
以下代码我么可以获取当浏览器发送请求 再到获取cookie cookie是将信息储存到这个浏览器的,用户是可以关闭的.(安全性较低)
//cookie 请求
@GetMapping("/c1")
public Result addCookie(String cookieName, HttpServletResponse response){
//浏览器添加
response.addCookie(new Cookie("goods",cookieName));
return Result.success();
}
//获取cookie
@GetMapping("/c2")
public Result getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("goods")){
return Result.success();
}
}
return Result.success();
}
3.Session
优缺点
-
优点:Session是存储在服务端的,安全
-
缺点:
-
服务器集群环境下无法直接使用Session
-
移动端APP(Android、IOS)中无法使用Cookie
-
用户可以自己禁用Cookie
-
Cookie不能跨域
-
以下代码我么可以获取当浏览器发送请求 再到获取session session是将信息储存到这个服务器的,但是同样是继承了cookie,所以用户是可以关闭的.
@GetMapping("/addSession")
public Result add(String goodName, HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("goods",goodName);
return Result.success();
}
@GetMapping("/getSession")
public Result get(HttpServletRequest request){
HttpSession session = request.getSession();
Object goods = session.getAttribute("goods");
log.info("获得的商品名,{}",goods);
return Result.success();
}
4.JWT令牌技术
优缺点
-
优点:
-
支持PC端、移动端
-
解决集群环境下的认证问题
-
减轻服务器的存储压力(无需在服务器端存储)
-
-
缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)
1.在Java中我们首先要使用jwt,需要引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2.生成token
@Test
public void jwt(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","小明");
String jwt = Jwts.builder()//获取token的生成构建者
.signWith(SignatureAlgorithm.HS256, "私钥")//设置签名的算法和签名的私钥
.addClaims(map)//设置载荷数据(需要什么数据放在token,就放什么)
.setExpiration(new Date(System.currentTimeMillis()+1200*1000*12))//设置间隔时间
.compact();//构建
System.out.println("生成的token为:"+jwt);
}
3.解析token
@Test
public void jwtAnalysis(){
Claims claims = Jwts.parser()//获取的是解析器
.setSigningKey("aXRjYXN0")//设置的解析签名的私钥
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6buR6amsIiwiaWQiOjEsImV4cCI6MTcxNDEyMTY3OH0.**************私钥生成的数字签名*****************")
.getBody();//获取到解析的数据中的荷载部分数据
System.out.println("获取的荷载数据:"+claims);
}
注意
篡改令牌中的任何一个字符,在对令牌进行解析时都会报错,所以JWT令牌是非常安全可靠的,同时令牌也是有时效性的,需要注意时间是否过期.