Java web笔记 (9 ) -- session 服务端会话技术

Session

一. 概念:

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

二. 快速入门:

  1. 获取HttpSession对象:
    HttpSession session = request.getSession();

  2. 使用HttpSession对象:
    Object getAttribute(String name) //获取
    void setAttribute(String name, Object value) //存入
    void removeAttribute(String name) //删除

  3. 实现
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三. session 数据共享原理:

先问一个问题,上述案例中sessiondemo1 和 sessiondemo2 中创建出来的session是 同一个吗??
答案: 是同一个 下面请看分析:

在这里插入图片描述
一开始我们使用浏览器请求sessiondemo1中的资源
sessiondemo1 中的逻辑:为我们创建了一个session 对象(创建的session是有编号的)。session对象就放在tomcat服务器的内存中,如图中蓝色圈圈“session对象”。 然后我们使用setAttribute方法存入数据。
然后服务器需要给浏览器响应,于是服务器创建了一个cookie头,
name为JSESSIONID,value为上述session的id。把此cookie放入响应头中传递给浏览器,如下图。
(这也就是session要依赖于cookie的原因)
在这里插入图片描述
浏览器收到响应数据后,再用浏览器请求sessiondemo2中的资源,于是乎,浏览器的请求头就带着这个cookie,传递给了 sessiondemo2。
在这里插入图片描述
sessiondemo2 收到这个cookie,再顺着这个JSESSIONIS去找到服务器中session的位置。
所以两个session 是同一个session。

四. session 的细节

1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

当然不是啦,默认情况下客户端一关闭,cookie就消失了,session的id也就随之消失了,找不到了。
那我们如何让session的存在时间变长呢????
我们只需要把存session id 的那个cookie 的存在时间变长就行了 。可可以使用setmaxage 方法,实现如下:
在这里插入图片描述

2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

当然不是同一个了,服务器关闭后,内存都被销毁了,哪里还有什么session对象啊
但是为了防止数据丢失,tomcat有session钝化和活化的功能。

session的钝化:

  • 在服务器正常关闭之前,将session对象系列化到硬盘上

session的活化:

  • 在服务器启动后,将session文件转化为内存中的session对象即可。
    所以 虽然session不是同一个,但是里面的值是一样的

3. session什么时候被销毁?

  1. 服务器关闭
  2. session对象调用invalidate() 。(自杀方法)
  3. session默认失效时间 30分钟。(可以在tomcat下的web.xml 中修改时长)
				//选择性配置修改	
				<session-config>
			        <session-timeout>30</session-timeout>
			    </session-config>

五. session的特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
  2. session可以存储任意类型,任意大小的数据

session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全

猜你喜欢

转载自blog.csdn.net/qq_43507104/article/details/107359191