Introduction and use of Cookie and Session(Cookie&Session的介绍和使用)

时间:2022-01-26 23:55:08

一、Cookie

1、什么是Cookie?

Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据。

  • 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。
  • 当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。
  • Cookie就是服务器保存在客户端的数据!
  • Cookie就是一个键值对

举例:HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能(也就是没有记忆力的协议,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。这说明需要使用额外的手段来跟踪会话,比如cookie、session)

Cookie主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

Cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie渐渐被淘汰。由于服务器指定Cookie后,浏览器的每次请求都会携带Cookie数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB

2、Cookie的使用

2.1 创建Cookie:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

2.2 在客户端请求中设置Cookie(摘抄api文档https://javaee.github.io/tutorial/jaxrs-client003.html#CHDHFFDJ

  您可以通过调用Invocation.Builder.cookie方法将HTTP cookie添加到请求中,该 方法将名称 - 值对作为参数。

Client client = ClientBuilder.newClient();
WebTarget myResource = client.target("http://example.com/webapi/read");
String response = myResource.request(MediaType.TEXT_PLAIN)
.cookie("myCookie", "The cookie value")
.get(String.class);

  所述javax.ws.rs.core.Cookie类封装一个HTTP cookie的属性,包括名称,值,路径,域和cookie的RFC规范版本。在以下示例中, Cookie对象配置了名称 - 值对,路径和域

Client client = ClientBuilder.newClient();
WebTarget myResource = client.target("http://example.com/webapi/read");
Cookie myCookie = new Cookie("myCookie", "The cookie value",
"/webapi/read", "example.com");
String response = myResource.request(MediaType.TEXT_PLAIN)
.cookie(myCookie)
.get(String.class);

二、Session

1、Session是什么?

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

2、Session原理

session是依赖Cookie实现的。session是服务器端对象
       当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,并创建一个Cookie,在Cookie中保存了session的id,发送给客户端。这样客户端就有了自己session的id了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId。
       当用户第二次访问服务器时,会在请求中把保存了sessionId的Cookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。
       当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。

当用户打开某个服务器页面长时间没动作时,这样session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到session对象了,那么服务器还是会创建一个新的session对象,再把新的sessionId保存到客户端。这也是一个新的会话开始了。

 session与浏览器:
 session对象是保存在服务器端的,而sessionId是通过Cookie保存在客户端的。
 因为Cookie不能在多个浏览器*享,所以session也不能在多个浏览器*享。也就是说,使用IE登录后,再使用FireFox访问服务器还是没有登录的状态。

而且同时打开多个相同浏览器的窗口,是在使用同一session。如果你使用的是老浏览器,例如IE6,那么就会每个窗口一个session

3、Session的使用

  用户信息保存到session前,先启动session_start();启动session $_SESSION['user']="zy";设置用户名unset($_SESSION['user']);销毁用户名session_destory();失去已经存储的session的数据

  Session 是 用于保持状态的基于 Web服务器的方法,开发人员可以调用request对象的getSession方法得到session对象。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。

  Session 通常用于执行以下操作

  存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。

  存储只需要在页面重新加载过程中或按功能分组的一组页之间保持其状态的对象。

  Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。

  持久性方法的限制

  随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加。

  访问 Web应用程序的每个用户都生成一个单独的 Session 对象。每个 Session 对象的持续时间是用户访问的时间加上不活动的时间。

  如果每个 Session 中保持许多对象,并且许多用户同时使用 Web应用程序(创建许多 Session),则用于 Session 持久性的服务器内存量可能会很大,从而影响了可伸缩性。

三、cookie和session的区别?

   
   1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
   
   2、Cookie有大小限制(不超过4K)以及浏览器在存cookie的个数也有限制(很多浏览器都限制一个站点最多保存20个cookie),Session是没有大小限制和服务器的内存大小有关。
 
   3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
 
   4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
 
 

四、cookie 和session 的联系?

 1、session是通过cookie来工作的

 2、session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。

购物网站中通常将用户加入购物车商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。