Session(Servlet)

Session(Servlet)

此HttpSession简称为Session
javax.servlet.http.HttpSession

Session概述

  1. Cookie可以将会话状态保存在客户端,而HttpSession可以将会话状态保存在服务器端
  2. HttpSession对象是一个会话级别的对象,一次会话对应一个HttpSession对象
  3. 在会话进程中,web服务器一直为当前这个用户维护着一个会话对象HttpSession
  4. 在web容器中,维护了大量的HttpSession对象,换句话说,在web容器中应该有一个“Session”列表

思考:为什么当前会话中的每一次请求都可以获取到属于自己的Session会话对象?

获取Session对象

HttpSession session = request.getSession();

注意:request.getSession(boolean)需要一个boolean类型的参数

  • 当参数为true时,getSession(true):session存在则返回;如果session不存在,则创建一个新的session对象并返回(无参数默认为true)
  • 当参数为false时,getSession(false):session存在则返回;如果session不存在,则不会创建session对象,返回null

Session实现原理

  1. 浏览器发送请求,服务器对应的Servlet首次调用request.getSession(true);方法时获取Session对象

    1. 服务器会创建一个Session对象,同时创建一个对应的Cookie对象,并且Cookie对象的name是JSESSIONID,Cookie的value是32位长度的字符串
    2. 服务器将Cookie的value和HttpSession对象绑定到session列表中(Map集合)
    3. 服务器将Cookie发送到客户端浏览器,浏览器将Cookie保存到缓存中
  2. 浏览器再次发送请求,会自动提交Cookie

    1. 当服务器Servlet再次调用request.getSession();方法时获取Session对象

    2. 服务器接收到Cookie,验证Cookie的name为JSESSIONID,然后获取Cookie的value

    3. 通过Cookie的value去session列表(Map集合)中检索对应的HttpSession对象

Session对象生命周期

  1. web系统中引入了session超时的概念

  2. 当很长一段时间(这个时间可以配置)没有用户再访问session对象,此时session对象超时,web服务器自动回收session对象

  3. 设置Session对象失效时间(两次请求之间的最大时间间隔),优先级 1 > 2 > 3

    1. 通过Java代码实现,单位秒

      HttpSession session = request.getSession();
      session.setMaxInactiveInterval(60*60);
      
    2. 修改项目的web.xml文件,单位分钟

      <session-config>
          <session-timeout>60</session-timeout>
      </session-config>
      
    3. 修改Tomcat默认配置,单位分钟,默认30分钟

      <!-- Tomcat7/conf/web.xml -->
      <session-config>
          <session-timeout>30</session-timeout>
      </session-config>
      

HttpSession中常用方法

void setAttribute(String name, Object value) 向会话范围中存储数据

Object getAttribute(String name) 从会话范围中获取数据

void removeAttribute(String name) 从会话范围中移除某个数据

void invalidate() 销毁session对象

void setMaxInactiveInterval(int interval) 设置session对象失效时间(浏览器向服务器两次请求之间最大时间间隔,超过最大设置时间间隔则销毁此session)

ServletContext、HttpSession、HttpServletRequest对比

  1. 以上都是范围对象

  2. ServletContext application 是应用范围

  3. HttpSession session 是会话范围

  4. HttpServletRequest request 是请求范围

  5. 三个范围的大小 application > session > request

  6. application完成跨用户共享数据;

    session完成跨请求共享数据,但是这些请求必须在同一个会话当中;

    request完成跨Servlet共享数据,但是这些servlet必须在同一个请求当中(请求转发)

  7. 使用原则:由小到大尝试,优先使用小范围

    例如:登陆成功之后,已经登陆的状态需要保存起来,可以将这个状态保存到session对象中;

    登陆成功状态不能保存在request范围中,因为一次请求对应一个request对象;

    登陆成功的状态也不能保存在application范围中,因为登陆成功的状态属于会话级别,不能所有用户共享。

什么是一次会话?

  • 一般可以这样理解:用户打开浏览器,在浏览器上发送多次请求,直到最终浏览器关闭,表示一次完整的回话。

  • 本质上理解:Session对象创建到最终超时销毁,才是真正意义的一次会话;因为即使浏览器关闭,可以通过重写URL的方式从其他电脑其他浏览器同样使用这个Session对象。

其他的一些问题

  1. HttpSession对象关联的这个Cookie的name是比较特殊的,在Java中就叫做:JSESSIONID

  2. 浏览器禁用Cookie会出现什么问题?

    • 浏览器禁用Cookie,则浏览器缓存中不再保存Cookie
    • 导致在同一个会话中,无法获取到对应的会话对象
    • 禁用Cookie之后,每一次获取的会话对象都是新的
  3. 浏览器禁用Cookie后怎么解决?

    • 浏览器禁用Cookie之后,若还想拿到对应的Session对象,必须使用URL重写机制,怎么重写URL:

      http://localhost:8080/webapp23/testSession;jsessionid=384A8D1CE7821C76EDC445F7D029C46A
      

      重写URL会给编程带来难度/复杂度,所以web站点是不建议禁用Cookie

      使用重写URL,即使换浏览器换电脑,只要访问的是同一个jsessionid,就可以得到同一个Session对象

  4. 浏览器关闭后,服务器端对应的session对象会被销毁吗?

    • 浏览器关闭后,服务器不会销毁session对象;因为B/S架构的系统基于HTTP协议,而HTTP协议是一种无连接/无状态的协议

    • 什么是无连接/无状态?

      请求的瞬间浏览器和服务器之间的通道是打开的,请求响应结束后,通道关闭;这样做的目的是降低服务器的压力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值