本质:
一个容器,存放会话过程中的任何对象
同一会话中多个request共享一个session对象, 可以直接从请求中获取session对象
位置:
session的创建和使用总在服务器端,浏览器从未得到过session对象。但浏览器可以通过请求Servlet来获取session的信息(sessionId...),即客户端浏览器真正拿到的是sessionId。
-->文件可通过HttpSession.getId()来获得sessionID
生成时间:
某server端程序调用HttpServletRequest.getSession(true);
没有显示使用<%@ page session="false"%>关闭session时,Jsp文件编译时会自动添加 HttpSession session=HttpServletRequest.getSession(true);
-->由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
。第一次访问服务器
。新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题
死亡时间:
程序调用HttpSession.invalidate()
服务器关闭或服务停止
session超时:连续一定时间服务器(超过服务器设置的最大超时时间)没有收到对应客户端请求,session失效
除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭。故此,服务器为session设置了失效时间
当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空 间。
关闭浏览器后,session不会消失。实际上,除非程序通知服务器删除)一个session,否则服务器会一直保留该session。
关闭浏览器后,sessionID会消失。再次链接服务器后无法找到之前的sessionID也就无法找到原来的session,若服务器设置的cookie被保存到硬盘上或使用某种手段改写浏览器的http请求头部,把原来的sessionID发送给服务器,而原来的session未被删除或未失效则仍可以找到原来的session
大体过程:
打开浏览器第一次请求jsp
服务器自动为其创建一个session,将sessionID发送给客户端的浏览器
客户端请求本应用中其他资源,自动在请求前添加 Cookie:JSESSIONID=客户端第一次拿到的sessionID
服务器收到请求后,通过收到的id在内存中找到之前创建的session对象,
提供请求
原理:
session机制是一种服务器端的机制,服务器使用一种类似于散列表来保存信息。
1.程序接收到客户端的请求时
①服务器检查到客户端的请求已经包含一个sessionID标识,并能通过其检索出来相关联的session,使用该session;
②服务器检查到客户端的请求已经包含一个sessionID标识,不能通过其检索出来相关联的session,新建一个session;
③服务器检查到客户端的请求不包含session标识,则程序为客户端创建一个session并生成一个与之相关联的sessionId,后者在本次响应中返回给客户 端保存
2.保存sessionId
①cookie
该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
②当cookie被人为禁止时,
IURL重写,即把sessionID直接附加在URL路径的后面-->
i 作为URL路径的附加信息---原url+“;”+"jsessionid=........" __sessionID信息和正常程序参数区分
ii 作为查询字符串---原url+“?”+“jsessionid=.......”
为了在整个交互过程始终保持状态,必须每个客户端可能请求的路径后面都包含这个sessionID
II 表单隐藏字段,即服务器自动修稿表单添加一个隐藏字段,以便提交变淡能够把sessionID传递回服务器
<input type="hidden"name="jsessionid"value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
但是这种技术很少应用,简单地用URL重写入action来代替。
常用方法: