你的位置:首页 > 软件开发 > Java > 【JAVA Web】Tomcat中的Session总结

【JAVA Web】Tomcat中的Session总结

发布时间:2016-04-26 17:00:44
什么是Session对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;Session的目的Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Sess ...

【JAVA Web】Tomcat中的Session总结

什么是Session

对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;

Session的目的

Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;

Session的主要目的就是为了弥补Http的无状态特性。简单的说,就是服务器可以利用session存储客户端在同一个会话期间的一些操作记录;

实现机制

先看两个问题,如下:

1、服务器如何标识客户端发送过来的请求是属于同一个会话?

答:用Sessionid区分,Session id相同的即认为是同一个会话;

2、服务器、客户端如何获取Session id?Session id在其之间是如何传输的呢?

答:服务器第一次接收到请求时,开辟了一块Session空间,同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应;

客户端收到响应后,设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;

接下来每次访问同一个网站时,请求头都会带上cookie信息(包含Session id);

而服务器则通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;

ps:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set-Cookie:“JSESSIONID=XXXXXXX”信息的;

而客户端是会在每次请求头的cookie中带上JSESSIONID信息;

举个例子:

chrome浏览器为例,访问一个基于tomcat服务器的网站的时候,

浏览器第一次访问服务器,服务器会在响应头添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,要求客户端设置cookie,如下图:

【JAVA Web】Tomcat中的Session总结

同时我们也可以在浏览器中找到其存储的sessionid信息,如下图

【JAVA Web】Tomcat中的Session总结

接下来,浏览器第二次、第三次...访问服务器,观察其请求头的cookie信息,可以看到JSESSIONID信息存储在cookie里,发送给服务器;且响应头里没有Set-Cookie信息,如下图:

【JAVA Web】Tomcat中的Session总结

只要浏览器未关闭,在访问同一个站点的时候,其请求头Cookie中的JSESSIONID都是同一个值,被服务器认为是同一个会话。

 再举个简单的例子加深印象,新建个Web工程,并写一个Servlet,在doGet中添加如下代码,主要做如下工作

首先,从session中获取key为count的值,累加,存入session,并打印;

然后,每次从请求中获取打印cookie信息,从响应中获取打印Header的Set-Cookie信息:

  /**   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)   */  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        if(request.getSession().getAttribute("count") == null){      request.getSession().setAttribute("count", 0);      response.getWriter().write(0+"");    }else{      int a = Integer.parseInt(request.getSession().getAttribute("count").toString());      request.getSession().setAttribute("count", ++a);      response.getWriter().write(a+"");    }    Cookie[] cookies = request.getCookies();    StringBuffer sb = new StringBuffer();    if(cookies!=null){      for(Cookie cookie : cookies){        sb.append(cookie.getName()+":"+cookie.getValue()+",");      }      sb.deleteCharAt(sb.length()-1);    }    System.out.println("[第"+(++index)+"次访问]from client request, cookies:" + sb);    System.out.println("[第"+(index)+"次访问]from server response, header-Set-Cookie:" + response.getHeader("Set-Cookie"));;  }

原标题:【JAVA Web】Tomcat中的Session总结

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。