本文最后更新于 90 天前,其中的信息可能已经有所发展或是发生改变。
一、会话技术
- 会话:用户打开浏览器,访问 web 服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
- 会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
- 令牌技术
二、会话跟踪
- cookie
在浏览器第一次请求服务器后,服务器会设置一个cookie,服务器会自动将cookie响应给浏览器,浏览器在接收到服务器响应的数据后,会自动地讲cookie存储在本地,在后续的请求中,浏览器会自动地将cookie携带到服务端
cookie是HTTP协议中支持的技术,各大浏览器厂商都使用了这个标准(http)
- 代码
@RestController
public class SessionController {
//设置Cookie
@GetMapping("/c1")
public Result cookie1(HttpServletResponse response) {
response.addCookie(new Cookie("login_username", "itheima")); //设置Cookie/响应Cookie
return Result.success();
}
//获取Cookie
@GetMapping("/c2")
public Result cookie2(HttpServletRequest request) {
Cookie[] cookies = request.getCookies(); //获取所有的Cookie
for (Cookie cookie : cookies) {
if(cookie.getName().equals("login_username")) { //输出name为 login_username 的cookie
System.out.println("login_username: "+cookie.getValue());
}
}
return Result.success();
}
}
访问c1,浏览器响应回来的数据(响应头)
浏览器在接收到响应的数据后会自动解析响应头,如果有一个响应头叫set-cookie,它会自动地将cookie的值存储在浏览器本地
访问c2的时候浏览器发送的请求头携带了cookie
– 优点:HTTP协议中支持的技术
– 缺点:
– 移动端APP无法使用Cookie
– 不安全,用户可以自己禁用Cookie
– Cookie不能跨域
跨域问题
- session
//往HttpSession中存储值
@GetMapping("/s1")
public Result session1(HttpSession session) {
log.info("HttpSession-s1: {}", session.hashCode());
session.setAttribute("loginUser", "tom"); //往session中存储数据
return Result.success();
}
//从HttpSession中获取值
@GetMapping("/s2")
public Result session2(HttpServletRequest request) {
HttpSession session = request.getSession();
log.info("HttpSession-s2: {}", session.hashCode());
Object loginUser = session.getAttribute("loginUser"); //从session中获取数据
log.info("loginUser: {}", loginUser);
return Result.success(loginUser);
}
访问c1,服务端的响应头
Jsessionid就是服务器端session的id
session的底层是基于cookie实现的
- 令牌技术