惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
IT之家
IT之家
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理

博客园 - leegool

常见XSD问题 EntitySpace 常用语句 抗投诉空间 C#用WebClient下载File时操作超时的问题 用C# 实现 Zen Cart 的用户密码加密算法 ASP.NET MVC 3 新特性 ASP.NET MVC 局部缓存实现 用户控件缓存 Partial Output Caching - leegool System.Web.Security.SqlMembershipProvider”要求一个与架构版本“1”兼容的数据库架构。 关于MarshalByRefObject的解释 MVC upload image MVC上传图片的例子 - leegool jQuery Custom Selector JQuery自定义选择器 - leegool 清楚浏览器缓存 Overview of Full Text Stop Words(MSSQL全文索引的干扰词概括)MSSQL 全文索引的最小单词长度 JQuery性能优化 MS SQL 事务隔离级别 认识ASP.NET 中的 AppDomain 国外服务器上 中文成 显示乱码 web性能优化(最佳) EntitySpaces 2009 Trial Expire 异常
Sharing cookie Across domain 跨域cookie访问 cookie跨域
leegool · 2009-08-22 · via 博客园 - leegool

Sharing cookie Across domain 跨域cookie访问 cookie跨域
今天研究一下cookie跨域的问题,主要有两种情况,
一种是允许跨子域访问,这种通过给Domain属性赋值的方法可以轻松实现。
另一种则是允许完全不相关的域可以访问同一个cookie。

这里主要介绍一下第二种的情况,
比如
http://www.blog.com/ 有 Login.aspx 页面
http://www.bbs.com/ 有 Login.aspx other.aspx页面
现在要求在用户在blog的登陆后,直接到bbs不要求再登陆了。

这里采用一取巧的方法,比较简单的实现这个功能,从另一种思路解决cookie跨域的问题,

先看一下blog的Login.aspx页面的代码

private void Login(string userName, string password)
    {
        
bool login;if (CheckLoginOKAndGetUserdID(userName, password))
        {
            login 
= true;
            Response.Write(
string.Format("<IFRAME style='WIDTH:1px;HEIGHT:1px' src='http://www.bbs.com/Login.aspx?userId={0}' frameBorder='0'></IFRAME>", userName));
        }
        
else
        {
            login 
= false;
        }
    }

当用户在blog登陆成功后,直接调用输出IFrame,并把userId作为URL的QueryString。
IFrame调用的Url就会执行bbs域的Login.aspx的Page_Load方法:

protected void Page_Load(object sender, EventArgs e)
    {
        
string userId;
        HttpContext.Current.Response.AddHeader(
"p3p""CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");//这句是关键,不能省掉
        userId = Request.QueryString["userId"];
        HttpCookie oCookie 
= new HttpCookie("UserID");
        oCookie.Value 
= userId;
        oCookie.Expires 
= DateTime.Now.AddDays(30);
        HttpContext.Current.Response.Cookies.Add(oCookie);

        oCookie 

= null;
    }

在这里,它把需要的值(userId),从URL的QueryString获得了,然后再写到当前域(bbs)的cookie里。从而实现了cookie的跨域共享,其实只不是跨域拷贝。
执行完这个方法后bbs的Other.aspx页面就可以访问"UserID"这个cookie了,从而不需要重新登陆。

请注意HttpContext.Current.Response.AddHeader("p3p""CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
关键是这句。因为IE浏览器会把由IFrame应用程序写的cookie看成是第三方cookie,所以如果没有加这句,cookie会被当作第三方cookie而被删除.
php里是加 header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

我调试的代码在IE7下通过,其它浏览器并未测试。