欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HttpSession

程序员文章站 2022-07-12 18:20:36
...
  1. HttpSession:在服务器端保持HTTP状态信息的方案,和其对应的是Cookie
  2. 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识即(sessionId),如果已经包含了一个sessionId则说明以前已经为此客户创建过session,服务器就按照sessionId把这个session检索出来使用(范如果检索不到可能会创建一个新的,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为的在请求的URL后面附加上一个JSESSION的参数)如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关的sessionId,这个sessionId将在本次响应中返回给客户端保存。
  3. 使用Cookie来跟踪session:session通过sessionId来区分不同的客户,session事宜cookie或URL重写为基础的默认使用cookie来实现,系统会创造一个名为JSESSION的输出cookie,这称之为session cookie,session cookie是存储于浏览器内存中的,并不是写到硬盘上,通常看不到JSESSIONID

HttpSession生命周期:

  1. 什么时候创建HttpSession
    1).对于JSP:
    是否浏览器访问服务端的任何一个JSP或Servlet,服务器都会立即创建一个HttpSession对象呢? 不一定。
    ①.若当前的JSP或(Servlet)是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性为false,则服务器就不会为JSP创建一个HttpSession对象;
    ②.若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象,则服务器也不会为当前JSP创建一个新的HttpSession对象,而会把和当前会话关联的那个HttpSession对象返回给当前的JSP页面。
    2).page指令的session="false"到底表示什么意思:当前JSP页面禁用session隐含变量!但可以使用其他的显式的对象
    3).对于Servlet而言:
    若Servlet是客户端访问的第一个WEB应用的资源,则只有调用了request.getSession()或request.getSession(true) 才会创建HttpSession对象
    4). 在Servlet中如何获取HttpSession对象?
    request.getSession(boolean create):create为false,若没有和当前JSP页面关联的HttpSession对象,则返回null;
    若有返回true create为true一定返回一个HTTPSession对象。若没有和昂前JSP页面关联的HttpSession对象,则服务器创建一个新的HttpSession对象返回,若有,则直接返回关联。
    request.getSession()等同于request.getSession(true)

  2. 什么时候销毁HttpSession对象:
    1).直接调用HttpSession的invalidate()方法:使HttpSession失效
    2).服务器卸载了当前Web应用。
    3).超出HttpSession的过期时间。

设置HttpSession的过期时间:单位为S
session.setMaxInactiveInterval(5);
out.print(session.getMaxInactiveInterval());

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

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session具有以下特点:
(1)Session中的数据保存在服务器端;
(2)Session中可以保存任意类型的数据;
(3)Session默认的生命周期是30分钟,可以手动设置更长或更短的时间。

小结:
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session"活跃(active)"了一次。
举例:当我们登陆一个网站,网站会记录我们的个人信息如用户名等,如果我们登陆了很长时间但是没有任何操作,那么session超时,我们再次操作时会让我们重新登陆。但是如果我们登陆后,一直在访问这个网站,就不会出现session超时的问题,我们也无需重新登陆。(个人理解)

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。

URL重写
  1. Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的回话
  2. 将会话标识好以参数形式附加在超链接的URL地址后面的技术成为URL重写
  3. 代码
<a href="<%response.encodeURL("login.jsp");%>">重新登录</a>