一、Session机制简介
•session机制采用的是在服务器端保持HTTP 状态信息的方案。
•session机制采用的是在服务器端保持HTTP 状态信息的方案。
•服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
•
当程序需要为某个客户端的请求创建一个
session
时,服务器首先检查这个
客户端的请求里
是否包含了一个
session
标识
(
即
sessionId
),
如果已经包含一个
sessionId
则说明以前已经为此客户创建过
session
,服务器就按照
sessionid
把这个
session
检索出来使用
(
如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的
session
对象,但用户人为地在请求的
URL
后面附加上一个
JSESSION
的参数
)
。如果客户请求不包含
sessionId
,则为此客户创建一个
session
并且生成一个与此
session
相关联的
sessionId
,
这个
sessionid
将在本次响应中返回给客户端保存
。
二、保存sessionid的几种方式
二、保存sessionid的几种方式
•
保存
sessionid
的方式可以采用
cookie
,这样在交互过程中浏览器可以
自动
的按照规则把这个标识发送给服务器。
•
由于
cookie
可以被人为的禁用,必须有其它的机制以便在
cookie
被禁用时仍然能够把
sessionid
传递回服务器,经常采用的一种技术叫做
URL
重写
,
就是把
sessionid
附加在
URL
路径的后面
,附加的方式也有两种,一种是作为
URL
路径的附加信息,另一种是作为查询字符串附加在
URL
后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个
sessionid
。
三、Session cookie
三、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什么时候失效?(设置Session失效时间)
四、Session的创建与删除
•
一个常见的错误是以为
session
在有客户端访问时就被创建,然而事实是直到某
server
端程序
(
如
Servlet
)
调用
HttpServletRequest.getSession
(true)
或者
HttpServletRequest.getSession
()
这样的语句时才会被创建。
Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
•
session
在下列情况下被删除:
–
A
.程序调用
HttpSession.invalidate
()
–
B
.距离上一次收到客户端发送的
sessionid
时间间隔超过了
session
的最大有效时间
–
C
.服务器进程被停止
•
注意
:关闭浏览器只会使存储在客户端浏览器内存中的
sessioncookie
失效,不会使服务器端的
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
方法