状态管理-Session

Session概述

什么是Session

  • 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象)。
  • Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

Session工作原理

  • session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
  • session的常见实现形式是cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
  • 实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,
    • 如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid时,服务端会检查找到与该session相匹配的信息
    • 如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。

Session使用

获得Session

  • 代码如下:
//获取Session对象
HttpSession session=request.getSession();
//唯一标记,
System.out.println("Id:"+session.getId());
//最后一次访问时间,毫秒
System.out.println("getLastAccessedTime:"+session.getLastAccessedTime());
//获取最大的空闲时间,单位秒
System.out.println("getMaxInactiveInterval:"+session.getMaxInactiveInterval());
//获取Session的创建,单位毫秒
System.out.println("getCreationTime:"+session.getCreationTime());

使用Session绑定对象

  • 使用HttpSession的setAttribute(属性名,Object)方法

删除Session

  • 使用HttpSession的invalidate方法可以让Session失效
  • 使用removeAttribute(“xxx”)可以删除保存的值

Session超时

什么是Session超时

  • HttpSession的最后一程访问时间和当前时间的差距大于了指定的最大空闲时间,这时服务器就会销毁Session对象。默认的空闲时间为30分钟。

修改Session的缺省时间限制

  1. 使用HttpSession的session.setMaxInactiveInterval(20*60);设置,单位秒
  2. 在web.xml中配置 ,单位分钟
  - <session-config>
      - <session-timeout>20</session-timeout>
  - </session-config>

Session失效的几种情况

  1. 超过了设置的超时时间
  2. 主动调用了invalidate方法
  3. 服务器主动或异常关闭
    • 注意:浏览器关闭并不会让Session失效

浏览器禁用Cookie的解决方案(了解)

浏览器禁用Cookie的后果

  • 如果浏览器禁用Cookie,session还能用吗?
  • 答:不能,但有其他的解决方案
  • 服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用如URL重写这样的方式来发送sessionID.
  • 使用Session区分每个用户的方式:
    1. 使用Cookie
    2. 作为隐藏域嵌入HTML表单中,附加在主体的URL中,通常作为指向其他应用程序页面的链接,即URL重写。

什么是URL重写

  • 浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即,在原来的地址后面加上了sessionID)

如何实现URL重写

  • 如果是链接地址和表单提交,使用response.encodeURL(String url)生成重写后的URL
  • 如果是重定向,使用response.encodeRedirectURL(String url)生成重写的URL


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦