这里有一篇资料:https://pan.baidu.com/s/1tjUyL7DwY2ganIfKnz_AJQ
在讲session和coookie之前,要先知道会话跟踪的概念。
在常见的Java Web开发中,我们经常会使用会话跟踪技术,来记录某一时段用户的行为。由于Web访问中使用的HTTP协议是无状态的——也就是说,当客户端的请求到来,服务端做出响应后,连接就关闭了。这样的好处是不用维护连接,节省资源;但缺点就是难于跟踪客户端的状态、不能唯一地标识用户,记录用户的状态。
例如,我们一般的网络Web请求需要针对用户做一些控制,如登录、用户管理等操作。可以用会话和状态解决这种需求。
会话&状态:
在一个请求的过程中,响应的时候,由服务器给我分配一个唯一ID号,这样就能区别不同的用户了;需要再次请求时,服务器就能通过这个ID来进行用户判断。一般使用session和cookie联动完成这种需求。另外还有一种SSL会话机制、URL重写技术。
最常用的回复跟踪技术。由服务器发送给客户的片段信息,存储在客户端浏览器的内存或硬盘上,在客户随后对该服务器的请求中发回。
Cookies以键值对的方式记录会话的跟踪内容,服务器利用响应报头Set-Cookie来发送Cookie信息。发送这些报头中具有不同的规范,可理解为不同的设置方式,包括了name/comment等格式。
浏览器在接受cookie后,下次发送给同一服务器的请求,也会发送请求报头:Cookie: uid=zhangsan
. 服务器取得不同的请求报头,就能实现不同用户的会话跟踪。
Cookie对用户透明,且一般持久性高,是在请求报头中被传送的,不会和传送的内容混淆。这样,由于Cookie可以保存在本地的磁盘中,可能会造成一些隐私和安全问题,用户可以使用浏览器禁用Cookie。
当Cookie被禁用后,服务端可以使用URL重写机制跟踪用户会话。URL重写时在URL中嵌入标识客户的SessionID,Servlet容器可以解析URL的方式获取SessionID,与特定的会话关联起来。
在Servlet规范中,这个参数的名字必须是jsessionid,一个示例:http://www.a.org/index.jsp;jsessionid=1234&name=aa
。所有的URL需要进行URL编码,来防止安全问题。
服务器为每一个会话创建一个session对象,分配一片内存空间,使用一个唯一的SessionID进行标识。请求过程中,用户的数据保存在相应的HttpSession对象内。在后续的请求中,用户可以根据会话的ID来获取到存储在session中的数据。
具体的过程:在Servlet容器中,HttpSession对象会被分配一个唯一的SessionID,将其作为Cookie(或者URL的一部分,URL重写机制)发送给浏览器,浏览器在内存中保存这个Cookie。当客户端再次发送HTTP请求时,浏览器将Cookie随请求一起发送,Servlet容器从中获取SessionID,找到对应的HttpSession对象,得到客户信息。
生命周期:
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException { HttpSession session = request.getSession(true);
Object count = session.getAttribute("COUNTER");
int counter = 0;
if (count == null) {
counter = 1;
//将第一次计数存入session
session.setAttribute("COUNTER", new Integer(1));
} else {
counter = ((Integer) count).intValue();
counter++;//计数加一
//将计数存入session
session.setAttribute("COUNTER", new Integer(counter));
}
}
示例:在登录页面用户已录入用户名,编写一个Servlet接收该数据,并把用户名值保存在HttpSession对象内
…
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
String userName=request.getParameter("userName");
HttpSession session=request.getSession();
if (userName!=null && "".equals(userName))
session.setAttribute("userName", userName);
else
response.sendRedirect("index.html");
}
...
String user = request.getParameter("user");
String pass = request.getParameter("pass");
Cookie userCookie = new Cookie("user", user);
userCookie.setMaxAge(60 * 60 * 24 * 365);//设置Cookie的最大有效期,秒为单位
Cookie passCookie = new Cookie("pass", pass);
passCookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(userCookie);
response.addCookie(passCookie);