c#mvc3在部署系统时发现一个看来很奇怪的问题,就是在google浏览器Chrome和Firefox下都运行的非常正常,但在IE内核的浏览器中总是无法登录的问题。无意间google下发现网上有很多针对IE8和IE10的cookie丢失的问题讨论,就想是不是IE8的cookie处理机制导致的,其实后来发现不是,因为打开IE的cookie管理中,勾选第三方第一方cookie就可以登录进去。因为本地运行正常并且是IE中都跑的蛮ok的,一到服务器上就出现了问题,具体的情形是我在网页中有一段类似如下的脚本引用:
-
<script language="javascript" src="http://abc.mydomain.com/p1/check"></script>
这段脚本就是向服务器abc.mydomain.com请求一段js,按理来说请求这段js时浏览器应该同时附带该域下的cookie到服务器上,服务器程序会解析到cookie并返回对应的信息,我出现的问题就是IE中根本就不发送cookie到服务器。而之前设置cookie的java代码类似如下:
-
Cookie cookie = new Cookie("name", "value");
-
cookie.setMaxAge(-1);
-
cookie.setPath(request.getContextPath());
-
response.addCookie(cookie);
这段脚本看起来没有什么错误,确实是在本地测试时一切正常。其实这个最大的问题就是setPath这条语句了,因为我这里是动态获取应用程序的上下文路径作为cookie的根路径,在本地测试时由于都有contentpath,所以不会有什么问题。但一旦部署到服务器后由于是独立域名部署根contextpath,所以取到的contextpath是空串,可惜的是IE对如下的cookie路径设置和chrome和firefox是完全不一样的:
-
cookie.setPath("");
实践证明IE会忽略这个path,而chrome和firefox则会认为是设置了。因为根据cookie规范,如果设置了path,那么只有当访问路径中包含了这个path的url时才会发送cookie到服务器;如果没有设置path,那么只有当访问和设置cookie同样的路径时才会发送cookie到服务器。可惜的是这里IE忽略了,因此会按照后面的来处理cookie,而chrome和firefox则会认为设置了path,那么理所当然的任何访问路径都会携带cookie,这也就导致了我前面所说的情况了。
附:cookie的一些小知识:
1、Cookie存放的目录
Cookie是存放在客户端的东东,放在“TemporaryInternetFiles”目录,所以说存在安全性的问题。大伙可通过以下方式找到具体位置:打开控制面板→Internet选项→常规→Internet临时文件→设置→即可看到“当前位置”,→点击“查看文件”将直接打开该文件夹,你也可以点击“移动文件夹”变更它所在的位置。
2、Cookie的有效期
从上图我们可以清楚的看到每个Cookie文档的“截止期”(即为有效期)。在有效期内,当登录计算机的用户Administrator再次访问172.meibu.com时,那么IE就会在请求页面的同时,连同上述的名称为“Cookie:administrator@172.meibu.com”的Cookie文档内容一起发送给服务器。
若该文档包含多个Cookie的值时,截止期则以最后的失效期为准。
3、Cookie的类型
这里我们按有效期来分,分为两种:
a)即时型
指的是关闭浏览器(所有浏览172.meibu.com的IE)后,Cookie便失效,此类Cookie不会在“TemporaryInternetFiles”目录出现。其实它也有截止期的,为“0001-01-01”
b)持久型
就是已指定具体“截止期”的,能够在“TemporaryInternetFiles”目录里面找到的Cookie
4、Cookie的内容
双击打开“Cookie:administrator@172.meibu.com”,我们看到以下内容,如下图(http://blog.csdn.net/images/blog_csdn_net/cityhunter172/85935/r_aspxForm06.jpg):
上图中,“■”是换行符,你若是要打破什么锅来问我到底是怎么知道的话。我倒是会很乐意的告诉你:这就是经验!偶从学习C#那刻起,就拿第一个Windows程序——记事本来开刀,保存文档时得来的经验。
所以服务器读出来的格式如下图(http://blog.csdn.net/images/blog_csdn_net/cityhunter172/85935/r_aspxForm07.jpg):
5、在ASP.NET页面发放Cookie
发送上述Cookie的.cs代码为:
System.Web.HttpCookie ck=new HttpCookie("ckValue0");
ck["Author"]="CityHunter";
ck.Expires=System.DateTime.Now.AddMinutes(10);//若不指定,则为即时型Cookie
//ck.Path="/FormTest/ManageSys";//设置Cookie的虚拟路径,注意一定要以“/”开头,否则为无效Cookie;请大家自行看一下它与在客房端的Cookie文档“名称”与“Internet地址”的关系
Response.Cookies.Add(ck);
ck=newHttpCookie("ckValue1");//重新新建一个名为ckValue1的Cookie
ck.Expires=System.DateTime.Now.AddMinutes(20);//即刻起20分钟后失效
ck["E_Mail"]="mailto:cityhunter172@126.com%22;//设置ckValue1中的E_Mail值
ck["PersonalWeb"]="172.meibu.com";
Response.Cookies.Add(ck);//添加此Cookie
6、取回已发放Cookie的值
Response.Write(Request.Cookies["ckValue0"]["Author"]+"<br>");//用不着说明了吧
Response.Write(Request.Cookies["ckValue1"]["E_Mail"]+"<br>");
Response.Write(Request.Cookies["ckValue1"]["PersonalWeb"]);
相关推荐
在本文中,我们将深入探讨IE8浏览器中处理Cookie的一些关键问题和解决方案,以及关于Opacity滤镜的使用。在开发Web应用程序时,尤其是在处理用户交互和界面效果时,这两个方面是至关重要的。 首先,我们来讨论IE8...
IE浏览器特有的Cookie处理机制确实可能引起基于Session的Web应用程序出现问题,尤其是在使用frameset结构时。通过适当调整响应头策略或改用URL重写传递Session ID的方法,可以有效规避这些问题,确保用户会话的一致...
(2)、不同的浏览器对Cookie的处理不一致,且有时会出现错误的结果。 (3)、限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。3、...
1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为...2.path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/te
Dim cookiePath As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Microsoft\Windows\Cookies" Dim files() As String = Directory.GetFiles(cookiePath, "*.txt") For Each...
(2)、不同的浏览器对Cookie的处理不一致,且有时会出现错误的结果。 (3)、限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。 3、...
(2)、不同的浏览器对Cookie的处理不一致,且有时会出现错误的结果。 (3)、限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。 3...
Path – 路径。指定与cookie关联的WEB页。 值可以是一个目录,或者是一个路径。 如果//www.jb51.net/test/index.html 建立了一个cookie,那么在//www.jb51.net/test/目录里的所有页面,以及该目录下面任何子目录里的...
在这个例子中,`name`和`value`分别是Cookie的名称和值,`expires`是过期时间,`domain=.wrox.com`表明这个Cookie对`.wrox.com`及其子域有效,`path=/`表示所有路径下都有效,`secure`标志表示仅在HTTPS连接中发送...
【P3P(Platform for Privacy Preferences)】是W3C提出的隐私保护标准,要求网站公开其对用户隐私的处理方式。如果网站的隐私政策符合用户设置的标准,浏览器会自动接受Cookie。然而,这可能导致用户在不知情的情况...
- **Internet Explorer (IE)**:将Cookie信息保存在一个特定的目录下,例如`C:\Windows\cookies`。 #### 二、Cookies的好处 Cookies的应用非常广泛,它们给网站和用户带来了许多便利,主要包括以下几点: 1. **...
例如,某些旧版本的IE浏览器可能不支持最新的JS特性。因此,编写代码时应尽量使用广泛支持的语法,并考虑使用工具如Babel进行转译,以确保向后兼容。同时,要测试代码在多种浏览器和设备上的行为,包括移动设备和...
代码如下: function ClearCookie() { var expires = new Date(); expires.setTime... //expires是对应过期时间的设置,不设这个值,cookie默认在关闭浏览器时失效 [removed] = “roleID=’333”’;path=/;expires=”
此外,文档中还提到了cookie在不同浏览器中的兼容性问题,比如FF(Firefox)和IE(Internet Explorer)对cookie的支持差异,以及如何在JavaScript中通过各种参数设置cookie的属性,如过期时间、路径、域和安全标志。...
- `cookiePath`:可选,指定Cookie的路径,不填则默认为当前页面路径。 2. **获取Cookie** 获取Cookie同样通过`document.cookie`,但需要解析这个字符串来找到特定的Cookie。以下是一个获取Cookie值的函数实例: ...
IE和Firefox对cookies的处理方式略有不同。在IE中,cookies存储在用户的个人文件夹下的一个名为"Cookies"的文件夹中,而Firefox则将它们存放在"Profiles"文件夹内的特定用户配置文件中。读取这些cookies通常需要编程...
// 使用 expires 属性,max-age 在 IE 中不被支持 } var path = options.path ? '; path=' + options.path : ''; var domain = options.domain ? '; domain=' + options.domain : ''; var secure = options....
`domain`参数设置Cookie可以被哪些域名访问,`path`参数指定Cookie在哪个URL路径下有效。在这个例子中,Cookie仅对`localhost`的根路径`/`有效。 5. **安全与隐私考虑**: 需要注意的是,Cookie通常用于非敏感...
jQuery Cookie插件兼容大多数现代浏览器,包括IE6+、Firefox、Chrome、Safari和Opera。然而,由于安全性和隐私政策的限制,某些浏览器可能不允许跨域设置或读取Cookie,因此在开发时需注意这个问题。 此外,由于...
- `jQuery.cookie.js`适用于大多数现代浏览器,但可能不支持一些旧版本的IE。在开发时应考虑兼容性问题,使用时可结合`Modernizr`等工具检测浏览器特性。 6. **应用场景**: - 用户设置:存储用户的界面偏好,如...