Sharing cookie Across domain 跨域cookie访问 cookie跨域
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页面的代码
当用户在blog登陆成功后,直接调用输出IFrame,并把userId作为URL的QueryString。
IFrame调用的Url就会执行bbs域的Login.aspx的Page_Load方法:
执行完这个方法后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下通过,其它浏览器并未测试。
今天研究一下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;
}
}
{
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的跨域共享,其实只不是跨域拷贝。{
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;
}
执行完这个方法后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下通过,其它浏览器并未测试。