Web服务器跟踪客户状态通常有四种方法
1.用cookie来传送用于跟踪客户状态的数据
2.重与URL,使它包含用于跟踪客户状态的数据
3.使用session会话机制
4.在html中加入隐藏字段,它包含用于跟踪客户状态的数据
1.cookie来跟踪
cookie是客户端访问web服务器时,服务器在客户端硬盘上存放的信息(C:\Documents and Settings\Administrator\Cookies其中Administrator为当计算机登录用户Cookies文件夹默认为隐藏不显示)以后客户端每次请求访问服务器时,都会在HTTP请求数据中包含Cookie,服务器解析HTTP请求中的Cookie就能得到客户的相关信息
向客户端写Cookie(Cookie存在于客户端硬盘中)
Cookie ck = new Cookie("username","shark");//创建一个Cookie使用键值对应方式与(Map类似)
response.addCookie(ck);//将Cookie添加至响应正文
ck.setMaxAge(1000);//设置Cookie的有效时间,无此行代码表示生命周期就是当前窗口不会写入文件中
servlet读取客户端Cookie
Cookie[] cks = request.getCookies();//通过request得到当前web服务中所有Cookie
for(Cookie ck : cks){//通过for循环读取getName得属性名,getValue得到值
response.getWriter().print(ck.getName()+"\t"+ck.getValue()+"<br>");
}
2.URL重写
通过向url连接添加参数,并把session ID做为值包含在连接中,需要对每一个Servlet响应部分的每一个连接都添加session ID
http://localhost:8080/test.jsp;jsessionid=xxxxx
http://localhost:8080/test.jsp?jsessionid=xxxxx
使用分号和问号做为分隔对用户来说没有区别只是服务器在解析时处理方式不同;必须在每个可能请求的连接后都加上对应的session ID值
当浏览器禁用cookie时Servet容器无法向客户端中存入表示session ID的cookie,此时可以使用HttpServletResponse接口提供的encodeURL(String url)来实现会话跟踪
<a href="<%=response.encodeURL('index.jsp')%>">
3.Session会话机制
一般情况下session都存在于服务器内存中,当服务器进程被停止或重启时内存中的session被清空,要想这些会话信息不丢失可以通过会话持久话来实现
Session与当前IE浏览器绑定,注意IE关闭session不会自动清除,只有调用invalidate()才会清除session;session失效是由Web服务器设置的如Tomcat/conf/web.xml中如下配置用来设置session会话过期时间(会话过期:指当前会话开始如在一段时间内,客户一直没有与web应用交互。即一直没有访问任何网页)
<session-config>
<session-timeout>30</session-timeout>//分钟为单位
</session-config>
如要设置自身web项目的session时间可将上配置文件复制到对应web.xml文件中进行配置
向IE中写入一个Session(session存在于服务器内存中)
HttpSession session = request.getSession();//创建一个session对象
session.setAttribute("username", "shark");//通过键值方式绑定一个session属性
读取IE中指定名称的Session
HttpSession session = request.getSession();//得到一个session对象
session.getAttribute("username");//通过getAttribute方法根据传递的name得到值
会话运作流程:
a)一个浏览器进程第一次请求访问(request)一个web应用中任意一个支持会话的网页。Servlet容器试图寻找HTTP请求中表示Session ID的Cookie,由于还不存在这样的Cookie,因此就认为一个新的会话开始了,于是创建一个HttpSession对象,并为它分配一个唯一的一个Session id,然后将这个sessionid作为Cookie添加到HTTP响应结果中。当浏览器接收到HTTP响应结果后(response),会将其中表示Sessionid的cookie保存在客户端
b)浏览器进程继续请求(request)页面,那么在本次HTTP请求中(request)包含表示Sessionid的Cookie。Servlet容器试图寻找HTTP请求中表示Sessionid的Cookie,由于能得到这样的Cookie,因此认为本次请求处于一个会话中。Servlet容器不再创建新的HttpSession对象,而是从Cookie中读取Sessionid,根据Sessionid找到内存中对应的HttpSession对象
c)浏览器重复(b)步骤,直到当前会话被销毁,HttpSession对象就会结束生命周期。
会话持久化:
把内存中的HttpSession对象保存到文件系统或数据库中,这一过程称为会话的持久化
好处:
1.节省内存空间
2.确保在服务器重启或web应用重启后,也能恢复当前会话
要实现会话持久化可以使用java语言提供的对象序列化技术。当持久化会话时,Servlet容器不仅会持久化HttpSession对象,还会对它所有可以序列化的属性进行持久化。从而确保放在会话范围内的共享数据不会丢失。所谓可以序列化的属性,就是指属性所属的类实现了java.io.Serializable接口
Java Servlet API 并没有为会话的持久化提供标准接口。会话的持久化完全依赖于Servlet容器。Tomcat采用会话管理器来管理会话
参考文档:<Tomcat_home>webapps/docs/config/manager.html
附:jsp中会话对象session对应的编程接口为HttpSession相关方法
public Object getAttribute(String name);
返回与指定名称name相关联的属性
public Enumeration getAttributeNames()
返回session对象中存储的每一个属性性,返回类型为枚举类型
public long getCreationTime();
返回建立session的时间,这个时间表示为自1970-1-1日(GMT)以来的毫秒数。
public String getId();
返回分配给这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串。
public long getLastAccessedTime();
返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。
public int getMaxInactiveInterval();
返加一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间
public void invalidate();
这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。
public boolean isNew();
返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求,这个session将被认为是新的
public void setAttribute(String name,Object value);
将一对name/value属性保存在HttpSession中
public void removeAttribute(String name)
从HttpSession中删除name参数的指定属性
public int setMaxInactiveInterval(int interval);
设置一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。
4.通过隐藏表单来实现
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="xxxxxx">
</form>