会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。
当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。
当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
- 1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
- 2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。 见 http://blog.csdn.net/xh16319/article/details/8464055
- 3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值。 见:http://blog.csdn.net/xh16319/article/details/8464319
- 4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
实现URL重写
URL重写在客户端浏览器不支持Cookie(下章介绍)的情况下使用的,它是客户端浏览器请求服务器时,URL地址后面加上类似于 “SESSIONID=***”形式的参数,服务器端通过获取SESSIONID关键字来获取会话值。
在程序第一次访问服务器端时,服务端并不能确认客户端浏览器是否支持Cookie。因此,当服务器第一次发出请求时,服务端会默认采用URL重写,也就是将SESSIONID写到URL地址中传递。
核心代码:String SessionId=request.getRequestedSessionId();
当客户端发送请求后,服务器会根据提交给客户端浏览器的信息自动检查客户端是否启用了Cookie,如果启用,将不再进行URL重写。如果没有,则继续使用URL重写。
通过response对象的encodeURL(String url)方法可以进行URL重写。
public String encodeURL(String url);
对包含SessionID的URL进行编码。如果不需要编码,就直接返回这个URL。
Servlet引擎必须提供URL编码方法,因为在有些情况下,我们将不得不重写URL。
例如,在响应对应的请求中包含一个有效的Session,但是这个Session不能被非URL的(例如Cookie)的手段来维持。
所以所有提供给Servlet的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
隐藏域和URL重写有着共同的优点:它们在Cookie被禁用或者根本不支持的情况下依旧能够工作。
缺点:
所有页面必须是表单提交之后的结果,还有涉及许多冗长的处理工作。
Cookie:
服务器默认创建一个Cookie回传给用户:(Cookie cookie = new Cookie("JSESSIONID",session.getId());response.addCookie(cookie);)此cookie的默认生命周期为关闭浏览器cookie即销毁,所以当浏览器关闭后,使用cookie实现的回话跟踪应用(如购物)将会失效。
解决浏览器关闭,装载sessionid的cookie 失效的问题: 可以通过创建一个名为"JSESSIONID"的cookie,然后设置cookie的生命周期(cookie.setMaxAge())来设置cookie的失效时间,如下:
package edu.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class BuyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
/**
* 设置session的空闲失效时间有两种方式:
* 1.在web.xml中设置:
* <session-config>
<session-timeout>2</session-timeout>
</session-config>
2.设置session的maxInactiveInterval属性,(session的 默认空闲失效时间为30分钟,即30分钟内不
访问服务器,session将自动销毁)如下:session.setMaxInactiveInterval(2*60);
也可以通过 session.invalidate();销毁session
**/
session.setAttribute("name", "联想笔记本");
/**
* session的原理是通过向浏览器发送存放sessionId的cookie来实现session的,而存放sessionId的cookie的默认
* 生命为浏览器关闭cookie消亡,所以当用户关闭浏览器后,其购物车商品会消失,为避免这种情况,应设置存放
* sessionId的cookie的生命周期
**/
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(30*60);//设置放置sessionId的cookie的生命周期为30分钟
cookie.setPath("/CookieAndSession");
response.addCookie(cookie);
}
}
如果用户禁用了cookie,则只能通过url重写的方式来实现回话跟踪。但是url重写的方式实现回话跟踪的不能解决浏览器关闭,无法获取原来的sessionid的问题,即不能解决浏览器关闭,回话失效的问题。关于使用url重写实现回话跟踪
一般大型的电子商务网站,一般是使用cookie实现回话跟踪的,因为如果使用session来实现回话跟踪的话,对服务器的压力很大,导致服务器性能下降!