zoukankan      html  css  js  c++  java
  • ASP.NET中Cookie跨域的问题及解决代码

    ASP.NET中Cookie跨域的问题及解决代码

    http://www.liyumei.net.cn/post/share18.html

    Cookies揭秘 

    http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html

    最近在项目开发中遇到一个很棘手的问题,一个用户在顶级域名登录后,跳转到自己所拥有的二级域名下管理二级网站时,cookie丢失了,一直找解决办法找了整整两天,百度谷歌一大堆,最终还是没解决。虽然结果让人不满意,不过最后学的东西还是有的,至少知道了几种大家认为能解决问题的方法(虽然在我自己的项目中不能用)。下面IT博客分享一种比较普遍而且被大多数认可的方法以及解决代码。
    
    大家都知道在默认情况下,Cookie与特定的域相关联。例如,IT博客的站点是www.liyumei.net.cn,那么当用户向该站点请求页面时,编写的Cookie就被发送到服务器。(有特定路径值的Cookie除外)。
    
    如果我们的站点有子域(例如liyumei.net.cn、a.liyumei.net.cn和b.liyumei.net.cn),要想把Cookie同特定的子域相关联,我们需要设置Cookie的 Domain 属性,如下所示:
    
       Response.Cookies( "domain ").Value = DateTime.Now.ToString
      Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1)
      Response.Cookies( "domain ").Domain = "b.liyumei.net.cn"
    如果按照这种方式设置域,则Cookie只能用于指定子域中的页面。
    
    当然我们也可以利用Domain属性来创建可在多个子域中共享的Cookie。例如,对域进行如下设置:
    
    Response.Cookies( "domain ").Value = DateTime.Now.ToString
     Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1)
     Response.Cookies( "domain ").Domain = "liyumei.net.cn"
    这样,该 Cookie 就可用于主域、a.liyumei.net.cn和 b.liyumei.net.cn。
    
    以下是创建一个跨域的Cookie,可以实现同一个根域下的Cookie
    
    如:www.liyumei.net.cn,在这个根域下的所有二级域名可共享Cookie,
    
    public static bool CreateCookie(string strCookieName, string strCookieValue,
     string strDomain, bool blURLEncode)
     {
    if (blURLEncode)
     {
    strCookieValue = System.Web.HttpContext.Current.Server.UrlEncode(strCookieValue);
      }
       HttpCookie objCookie = new HttpCookie(strCookieName, strCookieValue);
       objCookie.Domain = strDomain; //设置Cookie的域名
      System.Web.HttpContext.Current.Response.Cookies.Add(objCookie);
      return true;
       }   
    
    Cookie有三个属性需要注意一下:
    
    1. Domain 域
    
    2. Path 路径
    
    3. Expires 过期时间
    
    跨域操作需要设置域属性:
    
    Response.Cookies("MyCookie").Domain = "cnblogs.com"; (这里指的是泛域名)
    
    这样在其它二级域名下就都可以访问到了, ASP 和 ASP.NET 测试通过
    
    虚拟目录下访问:
    
    我在ASP端做了下测试,.NET的没试, 如果不指定Path属性, 不同虚拟目录下Cookie无法共享
    
    将Response.Cookies("MyCookie").Path = "/" 就可以了
    
    总的写法:
    
    Response.Cookies("MyCookie").Domain = "cnblogs.com";
    
    Response.Cookies("MyCookie").Path = "/"
    
    Response.Cookies("MyCookie").Expires = Now + 365;
    
    Response.Cookies("MyCookie")("Test") = "test";
    
    .NET 清除Cookie
    
    HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies[cookiename];
    
    if (cookie != null)
    
    {
    
    cookie.Values.Clear();
    
    SetUserCookieExpireTime(cookiename, -1);
    
    cookie.Domain = _domain;
    
    System.Web.HttpContext.Current.Response.Cookies.Set(cookie);
    
    }
    
    public static void SetUserCookieExpireTime(string key, int days)
    
    {
    
    System.Web.HttpContext.Current.Response.Cookies[key].Domain = _domain;
    
    System.Web.HttpContext.Current.Response.Cookies[key].Path = _cookiepath;
    
    System.Web.HttpContext.Current.Response.Cookies[key].Expires = DateTime.Now.AddDays(days);
    
    }
    
    .NET 添加/更新Cookie
    
    public static void AddUserCookies(string key,string value, string cookiename, string domain)
    
    {
    
    HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies[cookiename];
    
    if (cookie == null)
    
    {
    
    cookie = new HttpCookie(cookiename);
    
    cookie.Domain = domain;
    
    cookie.Path = _cookiepath;
    
    cookie.Values.Add(key, value);
    
    HttpContext.Current.Response.AppendCookie(cookie);
    
    }
    
    else
    
    {
    
    if (System.Web.HttpContext.Current.Request.Cookies[cookiename].Values[key] != null)
    
    {
    
    cookie.Values.Set(key, value);
    
    }
    
    else
    
    {
    
    cookie.Domain = domain;
    
    cookie.Path = _cookiepath;
    
    cookie.Values.Add(key, value);
    
    HttpContext.Current.Response.AppendCookie(cookie);
    
    }
    
    }
    
    }
    
    以上这种写法可以实现cookie跨域跨目录
    View Code
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/51net/p/4609145.html
Copyright © 2011-2022 走看看