Session

Session

Session是将会话状态保存在服务器的技术

1. 原理

  1. 当用户需要保存会话状态时,在服务器上为用户创建一个Session对象,保存会话状态
  2. 服务器将该Session对象的ID发给用户,方式是Cookie,内容JSESSIONID=123
  3. 用户在后续的请求中,会自动携带JSESSIONID的Cookie,服务器收到后,根据其值,查找用户对应的Session对象,获取用户的会话状态
    在这里插入图片描述

2. 相关API

  1. 创建一个Session对象

    	HttpSession session=request.getSession(boolean flag);
    		request.getSession(true) -> 有则使用,无则创建
    			逻辑:
    				1. 查询用户本次请求是否携带了JSESSIONID的Cookie
    				2. 没有带,则创建一个新的Session对象,返回引用
    				3. 如果带了,使用JSESSIONID的值查询对应的Session对象
    					1. 查到了,直接返回该对象的引用
    					2. 没查到,创建一个新的Session对象,返回引用
    		
    		request.getSession(false) -> 有则使用,无则返回null
    			逻辑:
    				1. 查看是否携带了JSESSIONID,无则返回null
    				2. 如携带,查找对应的Session对象,有则返回引用,无则返回null
    
    	HttpSession session=request.getSession();// 等同于传入true
    
  2. 从Session中存/取数据

    	session.setAttribute(String name,Object value); // 存
    
    	session.getAttribute(String name); // 取
    
    	session.removeAttribute(String name); // 删除
    

在这里插入图片描述

3. Session的销毁

1)超时

  1. Session对象默认的存活时间是30分钟,从用户最后一次访问该Session开始算

  2. 可以在web.xml中手动配置Session的超时时间
    默认单位是分钟

    	<session-config>
    		<session-timeout>15
    

2)自杀

  1. Session提供了一个API,可以马上销毁当前Session

    	session.invalidate();
    

3) 他杀(了解)

  1. 如果服务器异常关闭,所有的Session都会被销毁
  2. 如果服务器正常关闭,未超时的Session将会被序列化到本地硬盘上保存(钝化),当服务器再次其中时,本地硬盘上的Sesssion会被反序列化到内存中(活化),继续生效

4. Session和request在共享数据上的区别

  1. 在一次请求中共享数据,使用request,比Session高效

    1. 一次请求中共享的数据,响应发出后就没有必要存在了
    2. 如果保存在request中,根据request的生命周期,响应发出前,request会被销毁,数据也会被及时销毁
    3. 如果保存在session中,默认会保存30分钟,造成内存资源的浪费
  2. 跨请求共享数据,request无法实现,使用Session

    1. 服务器会为每次请求创建新的request对象,因此request无法实现跨请求的资源共享
    2. 涉及跨请求共享数据,不能使用request,只能用session
      在这里插入图片描述

5. Session的特点

  1. Session保存在服务器上,数据的安全性和稳定性相对高
  2. Session中保存的数据的大小,理论上是没有限制的
  3. Session存活的时间比较短,默认30分钟

6. Cookie和Session的区别?

1.Cookie是将会话状态保存在浏览器的技术
2.Session是将会话状态保存在服务器的技术
3.Cookie中的数据的安全性和稳定性较差,但是保存时间较长
4.Session中的数据安全性和稳定性较高,但是保存时间较短

7. Session发挥作用依赖于Cookie

  1. 如果用户在浏览器禁用了Cookie,Session将失效
  2. 解决方案:URL重写(了解)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值