Session和Cookie的联系与区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28666193/article/details/85100408

这里有一篇资料:https://pan.baidu.com/s/1tjUyL7DwY2ganIfKnz_AJQ

在讲session和coookie之前,要先知道会话跟踪的概念。

在常见的Java Web开发中,我们经常会使用会话跟踪技术,来记录某一时段用户的行为。由于Web访问中使用的HTTP协议是无状态的——也就是说,当客户端的请求到来,服务端做出响应后,连接就关闭了。这样的好处是不用维护连接,节省资源;但缺点就是难于跟踪客户端的状态、不能唯一地标识用户,记录用户的状态。

例如,我们一般的网络Web请求需要针对用户做一些控制,如登录、用户管理等操作。可以用会话和状态解决这种需求。

会话&状态

  • 会话:当前浏览器与服务器间多次的请求、响应关系,被称作一个会话。获取用户标识或授权信息。
  • 状态:记忆请求和处理的信息

在一个请求的过程中,响应的时候,由服务器给我分配一个唯一ID号,这样就能区别不同的用户了;需要再次请求时,服务器就能通过这个ID来进行用户判断。一般使用session和cookie联动完成这种需求。另外还有一种SSL会话机制、URL重写技术。

Cookies

最常用的回复跟踪技术。由服务器发送给客户的片段信息,存储在客户端浏览器的内存或硬盘上,在客户随后对该服务器的请求中发回。

Cookies以键值对的方式记录会话的跟踪内容,服务器利用响应报头Set-Cookie来发送Cookie信息。发送这些报头中具有不同的规范,可理解为不同的设置方式,包括了name/comment等格式。

一个例子如下:1545204942712

浏览器在接受cookie后,下次发送给同一服务器的请求,也会发送请求报头:Cookie: uid=zhangsan. 服务器取得不同的请求报头,就能实现不同用户的会话跟踪。

URL重写

Cookie对用户透明,且一般持久性高,是在请求报头中被传送的,不会和传送的内容混淆。这样,由于Cookie可以保存在本地的磁盘中,可能会造成一些隐私和安全问题,用户可以使用浏览器禁用Cookie。

扫描二维码关注公众号,回复: 4664074 查看本文章

当Cookie被禁用后,服务端可以使用URL重写机制跟踪用户会话。URL重写时在URL中嵌入标识客户的SessionID,Servlet容器可以解析URL的方式获取SessionID,与特定的会话关联起来。

在Servlet规范中,这个参数的名字必须是jsessionid,一个示例:http://www.a.org/index.jsp;jsessionid=1234&name=aa。所有的URL需要进行URL编码,来防止安全问题。

Session

服务器为每一个会话创建一个session对象,分配一片内存空间,使用一个唯一的SessionID进行标识。请求过程中,用户的数据保存在相应的HttpSession对象内。在后续的请求中,用户可以根据会话的ID来获取到存储在session中的数据。

具体的过程:在Servlet容器中,HttpSession对象会被分配一个唯一的SessionID,将其作为Cookie(或者URL的一部分,URL重写机制)发送给浏览器,浏览器在内存中保存这个Cookie。当客户端再次发送HTTP请求时,浏览器将Cookie随请求一起发送,Servlet容器从中获取SessionID,找到对应的HttpSession对象,得到客户信息。

生命周期:

  • 会话开始时创建,当浏览器访问服务器时,服务器为每个浏览器创建不同的session对象;开辟内存空间,保存数据信息。
  • 调用session. invalidate()方法,使session对象失效;访问时间间隔大于非活动时间间隔, session对象失效;关闭浏览器时,session对象失效。清空当前的内存的浏览器相关数据。注:同一浏览器的不同窗口可能是同一个进程,所以关闭后不会失效;要注意打开多个浏览器的方式。
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");
}
...

Cookie与Session的区别

  • Cookie在客户端保存信息,由服务器创建发送给客户的片段信息。
  • Session在服务器端保存信息,可以采用Cookie或URL重写的方式保存SessionID
    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);

重点:

  • Session和Cookie的最大区别是,Session在服务端保存信息,Cookie在客户端保存信息。为了跟踪用户会话,服务器在创建Session后,需要将SessionID交给客户端,在客户端下次请求时,将这个ID随请求一同发回。将SessionID发送给客户端的方式可以使用cookie或者URL重写的方式。
  • 一般而言,将直接用来跟踪用户会话的Cookie成为会话Cookie,在Servlet规范中,会话Cookie的名字必须是JsessionID,它通常也保存在内存中。在浏览器内存中的会话Cookie不能被不同浏览器进程共享。(可能读者打开多个浏览器,也能看到同样的结果,那是因为这些浏览器窗口是同一个进程中的多个线程;读者可以使用进程查看器查看)
  • 对于保存在硬盘上的Cookie,多个浏览器时进程间是可以共享的。Session不会随着浏览器的关闭而消失,只是因为内存中Cookie不在,重新打开的浏览器会开启一个新的会话。原Session一般会直到超时时间才会被服务器销毁。
  • Session由于存储在服务端,若保存大量将会造车服务器的性能负载问题。

猜你喜欢

转载自blog.csdn.net/qq_28666193/article/details/85100408