Cookie/Session详解

 Cookie/Session详解

首先,推荐Wireshare抓包工具,这个工具可以看到HTTP请求的详细信息,学习CookieSession时没有那么抽象。

1.1 为什么需要Cookie/Session

HTTP是一种无状态的协议,什么是无状态,听上去有点晦涩。下面从HTTP协议的流程来解释,HTTP协议是采用请求/响应模式,请求和响应结束后,客户端与服务器的链接就会关闭,当客户端再次请求服务器时,无法从服务器中获取上次链接的信息。因此,我们可以把无状态理解成“健忘或者无记忆”。我看到很多人的博客上说,HTTP协议是无状态的,无法维护前后连接,这种说法是错误的,其实实现方法有很多种,只是之前采用的方法很麻烦。例如我们需要保存某些信息,每次请求响应都可以带上这些信息。这种方法确实很麻烦,导致很多时候不得不花费大量的精力来保存串联上下连接的信息。

 

任何技术的出现都是为了解决问题,那么我们怎么解决上述问题呢?这时候我们就有了一个想法,把这些信息集中保存起来,然后通过ID去获取这些信息,至于我们将这些信息保存在哪里呢。有两种选择,一种是保存在客户端,另外一种是保存在服务器端,两者分别对应了Cookie技术和Session技术。举个例子。假设我每次回家,从高铁站到家,首先坐公交,然后坐地铁。这是最传统的方式是支付现金,也就是钱保存在客户端,这个方式有安全隐患,我们的钱可以会掉。假设有一种更先进的方式,每个人有个城市一卡通账户,支付方式采用指纹识别支付,钱是保存在服务器端,此时不用担心丢失的问题。

1.2 Cookie的原理

当我们请求服务器时,Cookie是由服务器端产生,在响应是返回给客户端(一般是浏览器),浏览器会将Cookiekey/value保存到某个目录下的文件内,在javaweb开发中,通常采用JSESSIONID来标记Cookie,这样保证了每个Cookie的唯一性,下次请求同一个网站时,浏览器可以发送Cookie给服务器,前提是前端浏览器设置为启用Cookie,Cookie的名称和值可以有由服务器端开发自己定义。在开发中我们可能会遇到多个应用公用Cookie跨域和前后台分离跨域的问题,导致Cookie读取不到,这个网上由详细的解决方案,这里不多讲了。

1.3  Session的原理

Session也是由服务器端产生,并且保存在服务器中,那么客户端怎样在会话中获取Session中的信息呢,一般是采用cookie实现,在javaWeb开发中当服务器创建好Session中,在第一次响应时,会在Set-cookie中传递一个JSESSIONID值,然后下次请求带上JSESSIONID获取上次请求的session,前提是Session没有失效。当浏览器禁用了Cookie时,可以采用重写URL方式实现。

 

1.4 CookieSession的对比

其实CookieSession都是会话的抽象,只是实现的方式不一样,两者各有优劣:

Cookie可以减少服务器的负担,并且保存时间可以设置很长;但是安全性方面现对差一些,当用户禁用了Cookie时无法维持会话。

Session保存在服务器端,安全性相对高一点,在客户端禁用了Cookie时,仍然可以维持会话;但是Session一般来说不能保存太久,对服务器的压力太大。

猜你喜欢

转载自blog.csdn.net/tao438031498/article/details/77427661