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"]);