Session机制

一、Session机制简介

session机制采用的是服务器端保持HTTP 状态信息的方案
服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个 session 时,服务器首先检查这个 客户端的请求里 是否包含了一个 session 标识 ( sessionId ), 如果已经包含一个 sessionId 则说明以前已经为此客户创建过 session ,服务器就按照 sessionid 把这个 session 检索出来使用 ( 如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的 session 对象,但用户人为地在请求的 URL 后面附加上一个 JSESSION 的参数 ) 。如果客户请求不包含 sessionId ,则为此客户创建一个 session 并且生成一个与此 session 相关联的 sessionId 这个 sessionid 将在本次响应中返回给客户端保存

二、保存sessionid的几种方式
保存 sessionid 的方式可以采用 cookie ,这样在交互过程中浏览器可以 自动 的按照规则把这个标识发送给服务器。
由于 cookie 可以被人为的禁用,必须有其它的机制以便在 cookie 被禁用时仍然能够把 sessionid 传递回服务器,经常采用的一种技术叫做 URL 重写 就是把 sessionid 附加在 URL 路径的后面 ,附加的方式也有两种,一种是作为 URL 路径的附加信息,另一种是作为查询字符串附加在 URL 后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个 sessionid

三、Session cookie

session 通过 SessionID 来区分不同的客户 ,session 是以 cookie URL 重写为基础的, 默认使用 cookie 来实现 系统会创造一个名为 JSESSIONID 的输出 cookie ,这称之为 sessioncookie , 以区别 persistentcookies ( 也就是我们通常所说的 cookie), sessioncookie 是存储于浏览器内存中的,并不是写到硬盘上的 ,通常看不到 JSESSIONID ,但是当把浏览器的 cookie 禁止后, web 服务器会采用 URL 重写的方式传递 Sessionid ,这时地址栏看到
session cookie 针对某一次会话而言,会话结束 sessioncookie 也就随着消失了,而 persistentcookie 只是存在于客户端硬盘上的一段文本。
关闭浏览器,只会是浏览器端内存里的 sessioncookie 消失,但不会使保存在服务器端的 session 对象消失,同样也不会使已经保存到硬盘上的持久化 cookie 消失。

四、Session的创建与删除

一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序 ( Servlet ) 调用 HttpServletRequest.getSession (true) 或者 HttpServletRequest.getSession () 这样的语句时才会被创建。
Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
session 在下列情况下被删除:
A .程序调用 HttpSession.invalidate ()
B .距离上一次收到客户端发送的 sessionid 时间间隔超过了 session 的最大有效时间
C .服务器进程被停止
注意 :关闭浏览器只会使存储在客户端浏览器内存中的 sessioncookie 失效,不会使服务器端的 session 对象失效。

五、 Session什么时候失效?(设置Session失效时间

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为30分钟。

       会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。

        <session-config>

           <session-timeout>30</session-timeout>

        </session-config>


  2. 调用Session的invalidate方法。

  3.在程序中调用session的setMaxInactiveInterval方法设置

    代码如下:session.setMaxInactiveInterval(30 * 60);  

     setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。


六、利用URL重写实现Session跟踪


•  Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。
•  将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。
HttpServletResponse接口中定义了两个用于完成URL重写方法:
    encodeURL 方法
    encodeRedirectURL 方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值