关于servlet会话跟踪,一搜都能搜出不少。我也难免落入俗套,也总结了一把。但愿我所总结的知识尽可能是知识海洋里的一汪清泉。能帮助到我本身和哪怕一我的,那也是值得的。html
咱们知道,http协议是个无状态的协议,所谓无状态就是指此时刻咱们的状态是保持链接,下一刻咱们的状态可能就是断开链接,状态是不稳定的,这就致使不少用户在上网时遇到问题,好比购物,我添加几回商品到购物车,若是没有会话跟踪,那么这些商品是没办法添加到一个购物车中的。再好比登陆,每次访问同一个网站时,我每次都要输入用户名和密码,在同一个网站中,每一个界面都要输入一次用户名和密码才能继续作其余事情。这就很尴尬了,因此,有会话跟踪技术的机制就诞生了。java
维持会话技术的4大法宝web
cookie在浏览器容许使用的状态下,当客户请求服务器后,服务器会发送一个含有惟一的sessionID的cookie给客户端,并保存到客户端本地,下次客户端再和服务器交互时,经过在request头中加入cookie中的信息,服务器能辨识出客户身份,从而维持会话。redis
在<input>中添加一个隐藏的字段,好比这样:chrome
<input type="hidden" name="sessionid" value="12345">
那么在提交表单时,会把这个隐藏的名为sessionID的值为12345的域提交在GET或者POST数据中,服务器收到个人请求后,会给一个客户端一个cookie中有浏览器
Cookie:JSESSIONID=E6047C8DB41EEA107256ECB443640C49
每次向服务器请求时,就带着个人JSESSIONID,服务器会认识个人JSESSIONID给我发送我须要的请求。缓存
在每一个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。tomcat
介绍完上面3个,下面是隆重登场的主角了。服务器
每个事物产生都有它的做用,session也是,session由servlet容器产生,是一种会话跟踪技术,能解决用户在登陆或者购物时多页面请求或存储相关用户信息。cookie
好比这么个场景:你在打开淘宝,而后看到个想买的商品后,你点击当即购买,可是这时候会跳到登陆那个新的界面,而后你登陆以后,什么事都不用作,再次回到那个商品购买界面刷新下,你就发现这时候你再买这个商品就能够了。这就是session的做用。
多说一句:上面说到的cookie,其中就包含有session的ID,session是借助cookie来实现会话跟踪的,因此,若是cookie被删或者禁用的话,session这个会话跟踪技术也就没法使用了。
session的前世此生:
这是后来补的,由于以前对session的理解有误差,因此这里纠正下。由问答形式给出。
session由谁建立,怎么建立?
session由服务器端建立,建立方式:HttpSession session = request.getSession(true)。
session在哪保存?
session保存在服务器端,session建立好会由Tomcat的StandardManager类将session存储在服务器内存中,也能够持久化到DB,file,redis中。
session既然由服务器建立,那么在Tomcat中如何建立的?
在tomcat服务器中由ManagerBase类提供建立方法:随机数+时间+jvmid。
session有哪些接口?
建立好session后就可使用session的API了,API在下面给出。
客户端会保存session吗?
客户端(浏览器端)是不会保存session的,session在服务器端保存,客户端只保存一个sessionid到cookie中,而不会保存session。
session最终是怎么销毁的?
经过session.invalidate、超时、关闭服务器中三者之一。单纯关闭浏览器session不会消失,由于session不在浏览器端保存,而在服务器端。
session的API以下:
public Object getAttribute(String name)
该方法返回在该 session 会话中具备指定名称的对象,若是没有指定名称的对象,则返回 null。
public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含全部绑定到该 session 会话的对象的名称。
public long getCreationTime()
该方法返回该 session 会话被建立的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public String getId()
该方法返回一个包含分配给该 session 会话的惟一标识符的字符串。
public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
public boolean isNew()
若是客户端还不知道该 session 会话,或者若是客户选择不参入该 session 会话,则该方法返回 true。
public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
public void setMaxInactiveInterval(int interval)
该方法在 Servlet 容器指示该 session 会话无效以前,指定客户端请求之间的时间,以秒为单位。
下面说的是session和session的ID,不一样的访问者对不一样的session和sessionID,
举例以下,一个test.html,一个testSession.java,一个google chrome,一个火狐浏览器。
test.html文件以下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Test</title> 6 </head> 7 <body> 8 <form action="http://127.0.0.1:8081/HelloServlet/testSession" method="post"> 9 <input type="text" name="username" /> 10 <input type="submit" /> 11 </form> 12 </body> 13 </html>
testSession.java文件以下(.java文件使用的是eclipse下建立的servlet文件)
1 package com.hundsun.vivizhang.servlet; 2 3 import java.io.IOException; 4 5 import java.io.PrintWriter; 6 import java.util.Date; 7 8 import javax.jws.WebService; 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 16 @WebServlet("/testSession") 17 public class testSession extends HttpServlet{ 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#HttpServlet() 22 */ 23 public testSession() { 24 super(); 25 // TODO Auto-generated constructor stub 26 } 27 28 /** 29 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 30 * response) 31 */ 32 protected void doGet(HttpServletRequest request, HttpServletResponse response) 33 throws ServletException, IOException { 34 // Create a session object if it is already not created. 35 HttpSession session = request.getSession(true); 36 // Get session creation time. 37 Date createTime = new Date(session.getCreationTime()); 38 // Get last access time of this web page. 39 Date lastAccessTime = 40 new Date(session.getLastAccessedTime()); 41 42 String title = "Welcome Back to my website"; 43 Integer visitCount = new Integer(0); 44 String visitCountKey = new String("visitCount"); 45 String userIDKey = new String("userID"); 46 String userID = new String("ABCD"); 47 48 // Check if this is new comer on your web page. 49 if (session.isNew()){ 50 title = "Welcome to my website"; 51 session.setAttribute(userIDKey, userID); 52 } else { 53 visitCount = (Integer)session.getAttribute(visitCountKey); 54 visitCount = visitCount + 1; 55 userID = (String)session.getAttribute(userIDKey); 56 } 57 session.setAttribute(visitCountKey, visitCount); 58 59 // Set response content type 60 response.setContentType("text/html"); 61 PrintWriter out = response.getWriter(); 62 63 String docType = 64 "<!doctype html public \"-//w3c//dtd html 4.0 " + 65 "transitional//en\">\n"; 66 out.println(docType + 67 "<html>\n" + 68 "<head><title>" + title + "</title></head>\n" + 69 "<body bgcolor=\"#f0f0f0\">\n" + 70 "<h1 align=\"center\">" + title + "</h1>\n" + 71 "<h2 align=\"center\">Session Infomation</h2>\n" + 72 "<table border=\"1\" align=\"center\">\n" + 73 "<tr bgcolor=\"#949494\">\n" + 74 " <th>Session info</th><th>value</th></tr>\n" + 75 "<tr>\n" + 76 " <td>id</td>\n" + 77 " <td>" + session.getId() + "</td></tr>\n" + 78 "<tr>\n" + 79 " <td>Creation Time</td>\n" + 80 " <td>" + createTime + 81 " </td></tr>\n" + 82 "<tr>\n" + 83 " <td>Time of Last Access</td>\n" + 84 " <td>" + lastAccessTime + 85 " </td></tr>\n" + 86 "<tr>\n" + 87 " <td>User ID</td>\n" + 88 " <td>" + userID + 89 " </td></tr>\n" + 90 "<tr>\n" + 91 " <td>Number of visits</td>\n" + 92 " <td>" + visitCount + "</td></tr>\n" + 93 "</table>\n" + 94 "</body></html>"); 95 } 96 97 /** 98 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 99 * response) 100 */ 101 protected void doPost(HttpServletRequest request, HttpServletResponse response) 102 throws ServletException, IOException { 103 // TODO Auto-generated method stub 104 doGet(request, response); 105 } 106 }
此处不用配置web.xml文件。
实验开始,先清掉浏览器的缓存,而后在浏览器中输入 localhost:8080/HelloServlet/test.html ,个人图中用的是127.0.0.1的环路地址,是同样的哈。
输入完后,打开chrome的F12按键,敲击回车,访问到页面,获得的不含cookie的F12中的截图(图1)是这样的。
图1
而后输入一些信息,点击提交后,F12调试页面是这样的(图2)。
图2
点击提交后跳转到这个界面(图3)
图3
而后就能获得下面的结论:
(1)同一浏览器相同学口刷新后,访问的是同一sessionID,如图4所示,刷新1次,显示访问次数为2.
(2)同一浏览器不一样窗口访问,访问的是同一sessionID,如图4所示,开两个窗口,可是sessionId仍然是E04B...065.
图4
(3)同一浏览器关闭后再次访问也不是同一session,如图5所示,切换到firefox后id和visitCount都不一样了。
图5
(4)不一样的浏览器访问是不一样session和sessionID。如图6所示。
图6
这个故事说的是会话跟踪的技术,之后在使用Servlet时,要学会使用,这是一个很是重要的技术,可是也听到有反对使用cookie的,这些都不是重点,重点是这个技术是如今web开发必不可少的。