会话跟踪

136 阅读1分钟

HTTP是一种“无状态”(stateless)的协议

  • 每次客户端访问网页时,客户端都会打开与web服务器的单独连接
  • 并且服务器不会自动保留之前客户端请求的任何记录
  • 所以服务器无法识别多个请求是否来自同一个客户端(比如浏览器)

在很多应用场景中,都有以下需求

  • 服务器能够识别出多个请求是否来自同一个客户端
  • 在来自同一个客户端的多个请求之间共享数据

以上需求可以使用会话跟踪技术来完成。在Java中, 实现会话跟踪的常用方案是

  • Cookie
  • Session

Cookie

image.png

有效期

image.png

作用域

image.png

  • domain 只包含主机,不包含端口。例如设定domin=10.86.35.36,那么对 10.86.35.36:8088,10.86.35.36:8089都有效。

  • js中path默认/,java中cookie默认path是/context_path.domain默认是当前主机不包括端口。

  • 存储在客户端的cookie,有些时候会主动发送给服务器。

服务器设置Cookie

Cookie cookie = new Cookie("name", "mj");
response.addCookie(cookie);

image.png

参考资料1

参考资料2

Session

session底层是用的cookie技术。

服务器

request.getSession();

getSession()内部原理

image.png

image.png

Session的有效期

image.png

session默认30分钟未使用,自动销毁。这里指未使用;

服务器停止了,session还会存在吗? 看是什么容器,如果是Tomcat的话。Tomcat停止的时候会把session持久化入磁盘,重启的时候会重新读取。这时候session的内存地址变了,但是id不变。依然可以取到停止之前的session对象。但是使用IDEA的时候,会将磁盘的session文件删除。所以使用IDEA时,服务器停止了,session会丢失。

总结:

image.png