• Cookie的跨域问题


    被误解的HttpCookie.Domain属性

    有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示

    这其实是错误的,运行后通过浏览器查看,并没有成功写入B站的cookie(读取也是一样失败,由于浏览器的隐私策略限制,禁止读取非本域的cookie).

    所以这个Domain属性,应该是可以跨子域,例如x.A.com和y.A.com,通过设置HttpCookie.Domain=“.A.com”,实现跨子域访问。

    //A站a_setCookie.aspx (www.a.com)
    HttpCookie cookie = new HttpCookie("key");
    cookie.Value = key;
    cookie.Domain = ".b.com";//这里指定的是B站
    cookie.Path = "/";
    cookie.Expires = DateTime.Now.AddHours(1);
    filterContext.RequestContext.HttpContext.Response.Cookies.Add(cookie);

    既然cookie无法跨域共享,那如何实现跨域访问呢?

    可以利用script标签间接调用B站的页面,实现写入B站cookie的目的。

    步骤一:先在B站(b_setCookie.aspx)下设置cookie的方法:

    HttpCookie cookie = new HttpCookie("key");
    cookie.Value = key;
    cookie.Domain = ".b.com";//这里指定的是B站
    cookie.Path = "/";
    cookie.Expires = DateTime.Now.AddHours(1);
    Response.Cookies.Add(cookie);
     

    步骤二:由于<script>标签可以自动访问第三方网站,因此可以在A站的页面,例如a_setCookie.aspx的页面<head>标签内下设置如下:

    <head><script src="http://www.b.com/b_setCookie.aspx" /></head>

    以上步骤完毕,当访问A站的a_setCookie.aspx时,就会自动访问http://www.b.com/b_setCookie.aspx,实现写入B站cookie的目的。

    测试B站cookie是否设置成功,B站下新建页面b_getCookie.aspx,读取B站的cookie

    var key=Request.cookie["key"];
    //或者
    key=Request["key"];

    注意:访问b_getCookie.aspx前,先访问A站的a_setCookie.aspx

    注意浏览器的第三方 cookie 限制

    所谓第三方 cookie,就是说你访问域名 A的一个页面,却接收到域名 B 的 cookie 设定指令。那么B就属于第三方,不同浏览器对于第三方cookie的限制有些区别,如下表

    不同浏览器的第三方 cookie 规则
     IEFIREFOXCHROMESAFARIOPERA
    限制第三方coookie

    使用p3p跨域设置Cookie

    p3p((Platform for Privacy Preferences))介绍

    http://baike.baidu.com/link?url=WVQp0aTUQgCoIzYm7rV_mur829NtWZCiSq9Kee_WusqmOWOQDwS2DNzw_S5M6UM-EcvNCliBHvYAV4kEjRBip_

    为了消除这个限制,可以在b_setCookie.aspx加上如下设置

    Response.Headers.Add("P3P", "CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"");

     

  • 相关阅读:
    kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    MYSQL 大数据
    MYSQL 数据库优化
    原始代理需要改进的地方
    JDK动态代理
    使用CGLIB生成代理
    Spring
    Struts2面试题
    hibernate面试题
    Mac下创建隐藏用户
  • 原文地址:https://www.cnblogs.com/imust2008/p/5409191.html
Copyright © 2020-2023  润新知