在bs的架构中,浏览器作为客户端,与服务器之间通过session保持连接状态。以前面试的时候,经常被问及一个问题:浏览器禁止cookie时,服务器与客户端浏览器能否保持session连接?
其实要完全回答正确这个问题,需要对cookie的作用有全面的了解。具体cookie的解释大家可以google一下。我以前一直有一个误解(估计很 多人都有),以为cookie就是一个文件,用来保存用户信息或者其他信息。如果这么认为的话,那么浏览器禁用cookie也就是不保存成文件而已,并不 影响浏览器与服务器交互。其实如果我们看看浏览器发出的http请求消息和服务器的http响应消息就一目了然了。
Http request:
GET /cluster/index.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Http response:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=4918D6ED22B81B587E7AF7517CE24E25.server1; Path=/cluster
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 377
Date: Tue, 02 Mar 2010 02:58:32 GMT
这是我们打开浏览器后,第一次请求一个网址时的请求和响应消息(如果客户本地没有该网址的cookie)。首先看response消息,可以看到一行醒目 的字符串Set-Cookie: JSESSIONID=1363B650B295DE9494A33805F62BC5ED.server1; Path=/cluster。其实这行是在告诉客户端浏览器,把这段cookie保存下来,根据cookie的存活时间,这段cookie信息有可能只存 在在内存中,也可能保存到文件中。下面不关闭浏览器,再次请求同样的url,观察第二次的请求和响应消息:
Http request:
GET /cluster/user_details.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Cookie: JSESSIONID=4918D6ED22B81B587E7AF7517CE24E25.server1
Http response
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=4918D6ED22B81B587E7AF7517CE24E25.server1; Expires=Tue, 02-Mar-2010 22:15:38 GMT
Content-Type: text/html
Content-Length: 252
Date: Tue, 02 Mar 2010 05:35:38 GMT
这个时候注意看请求信息中多了一行Cookie,浏览器将这个Cookie信息传递给服务器,这次服务器返回的Set-Cookie中的JSESSIONID就和请求的JSESSIONID一致了。
通过这两次实验,总结出以下几点:
1.session是什么?session其实是在无状态会话的http协议下,为了实现有状态会话而设计的一种实现方法。
2.如何实现session会话?简单的说,就是在服务器端创建session对象,记录会话信息,同时在客户端与服务器的交互过程中,通过 JSESSIONID字符串唯一标识session对象(客户端只需要保存JSESSIONID这个字符串,服务器端只需要保存JSESSIONID和真 实的session对象之间的关联关系),而这个JSESSIONID字符串就是通过http协议的cookie功能实现的。
3.浏览 器禁用cookie时会发生什么?浏览器禁止了Cookie,那么第二次请求中将不包含有Cookie信息(当然更不存在JSESSIONID信息),服 务器也就不会收到JSESSIONID的值,于是服务器认为是新请求,又创建一个服务器session,同时将本次生成的JSESSIONID再次通过响 应信息中的Set-Cookie返回给客户端。如此循环交互,服务器将永远认为该客户浏览器的请求是新请求,因此无法实现session功能。
最后回到最初的那个面试问题:浏览器禁止cookie时,服务器与客户端浏览器能否保持session连接?当然可以,但是现在不能依靠浏览器自动完成 这个功能,而是需要服务器端通过重写URL的方法来实现,就是在返回的页面中,在URL里将JSESSIONID的值作为请求参数传递给服务器端,例 如<a href="">。
注意:JSESSIONID要大写,小写的服务器不认。
相关推荐
### HTTP Cookie 协议管理标准分析以及结构实现 #### 基本原理及作用 Cookie是一种小型的数据存储机制,主要用于在网络应用中...开发者需要关注HTTP协议中有关Cookie的规范,并根据实际需求合理设计Cookie管理逻辑。
- **定义**: 如果Cookie设置了`httpOnly`属性,那么该Cookie只能通过HTTP协议进行访问,即JavaScript等客户端脚本无法读取到Cookie信息。 - **作用**: 防止通过客户端脚本(如JavaScript)进行的跨站脚本攻击(XSS)。...
【标题】"Dubbox跨域请求、Cookie设置"所涉及的知识点主要集中在分布式服务框架Dubbo的跨域问题处理和Cookie的配置上。Dubbox是阿里巴巴开源的一个基于Dubbo的扩展,提供了更多的特性,如REST支持、Zookeeper注册...
### Android Cookie 获取与设置以及 WebView 的 Cookie 同步 在 Android 开发中,Cookie 的管理和同步对于维护用户会话状态至关重要。特别是在使用 HttpClient 发起网络请求时,保持客户端与服务器端 Session 的...
设置cookie主要涉及以下几个步骤: 1. 创建一个键值对对象,例如`{key: 'username', value: 'JohnDoe'}`。 2. 将对象转换为字符串,以便在HTTP头部中发送。可以使用`encodeURIComponent`函数对键和值进行编码,防止...
总之,获取HTTP报文头中的Cookie内容涉及HTTP协议的理解、网络库的使用(或自定义实现)以及报文头的解析。通过学习和实践,你将能够熟练地在C++中处理网络通信中的Cookie管理,从而更好地开发Web应用程序或服务。...
计算机后端-PHP视频教程. http协议11 http协议与cookie.wmv
在HTTP协议中,Cookie是一种用于维护客户端和服务器之间状态的小型文本文件。当用户访问一个网站时,服务器可能会发送一个Cookie到用户的浏览器,浏览器会将Cookie保存起来,当用户再次访问该网站时,浏览器会将之前...
这个过程使得服务器能够识别和跟踪用户,即使在无状态的HTTP协议下也能实现状态保持。 **Cookie的读取与写入** 在Java中,我们可以使用HttpServletResponse和HttpServletRequest接口来操作Cookie。写入Cookie的...
Cookie是在HTTP协议下,服务器发送到用户浏览器并保存在本地的一小块数据,它用于记录用户的浏览历史、登录状态等信息。在易语言中,处理Cookie主要有两个关键函数:`InternetSetCookieA` 和 `InternetGetCookieA`。...
它们主要用于跟踪用户会话、保存用户偏好设置以及在无状态的HTTP协议中维护用户状态。在C#中,我们可以使用`System.Web.HttpCookie`类来操作Cookie。 1. **创建Cookie** 创建Cookie的基本步骤如下: - 创建一个`...
Cookie浏览器是一种特殊的网络浏览工具,它利用了HTTP协议中的Cookie技术来实现特定功能,如网页登录绕过和邮箱免登录。Cookie是Web服务器在用户浏览器上存储的一小段数据,用于识别用户身份、保持登录状态、个性化...
4. **响应头**: 服务器的响应也会包含响应头,如Server标识服务器类型,Content-Type表示响应内容的MIME类型,Set-Cookie用于设置或修改cookie。 5. **实体主体**: 请求和响应都可以包含实体主体,用于传输数据。...
要认清HTTP协议的本质,我们需要从以下几个关键点入手: 1. 请求与响应模型:HTTP通信基于请求-响应模型。客户端发起一个HTTP请求到服务器,服务器处理请求并返回一个HTTP响应。请求由方法(如GET、POST)、URL、...
在IT行业中,Cookie是Web应用程序中广泛使用的机制,用于存储客户端状态信息。它们是由服务器发送到用户...确保在实际应用中遵循HTTP协议和相关的安全最佳实践,以保护用户数据并防止跨站脚本攻击(XSS)等安全问题。
Web服务是一种通过HTTP协议提供功能的方法,使得不同系统间的应用可以相互通信。.NET Web服务通常基于SOAP(Simple Object Access Protocol)协议,而Java可以通过使用JAX-WS(Java API for XML Web Services)来...
POST方法是HTTP协议中用于传输大量数据的一种方式,而cookie则是用来存储用户会话信息的小型文本文件。 在【描述】中提到,用户对现有的POST工具感到不满,因此自行开发了这个PHP版本的工具。这个工具设计用于PHP...
Cookie是Web开发中的一种技术,用于在客户端存储和管理数据,解决了HTTP协议无状态的问题。它们是由服务器端生成,发送到客户端(浏览器),并由浏览器保存。当用户再次访问同一网站时,浏览器会将Cookie回传给...
添加Cookie通常通过HTTP响应头完成。在服务器端,开发者可以使用特定的编程语言(如JavaScript、PHP或ASP.NET)来设置Cookie。例如,在JavaScript中,我们可以使用`document.cookie`属性来设置Cookie: ```...