无法删除Angular JS中的cookie

时间:2014-01-03 16:35:29

标签: javascript angularjs cookies

使用$cookies

删除Cookie时遇到了很多麻烦

注销时,我的代码执行:

        var deferred = $q.defer()

        $http.post( REST.logout, {} )

            .finally( function() {
                // finally callback is triggered both on success and error,
                // since I don't really care if the server is dead or whatever

                console.log('out!')
                console.log( $cookies['persistent'] )

                delete $cookies['persistent']
                $cookies['persistent'] = undefined

                console.log( $cookies['persistent'] )

                deferred.resolve()
            })

        return deferred.promise

输出是:

    out!
    "441b5deca5da04cad774a3844b6865dac8a98e91-oi=11"
    undefined 

然而,cookie不会打扰自己......


正如此问题Can't delete cookie with AngularJS's $cookies中所述,我检查了域名,在我的情况下是相同的,因为我的网络应用程序从domokun.zodiac.lan运行,而Cookie的域名为.zodiac.lan

我可以补充说,它无法在服务器端重新设置,因为我已经切断了客户端和服务器之间的通信,以便对其进行测试。

你有可能看到我错过的东西会很精彩!



测试角度1.2。[2-5]

4 个答案:

答案 0 :(得分:1)

另一种可能性是你可能遇到了我遇到的问题。在我的情况下,我想删除一个在我的应用程序之外创建的cookie,因此它不在同一个域中。我们通过公共门户拦截客户的登录信息以提供用户名/密码。然后,这会创建一个身份验证cookie,以后可以由应用程序读取,然后将请求转发给应用程序。

无论如何,问题在于您必须具体定义要删除的cookie的路径和域。 Angular能够在不指定路径或域的情况下读取此cookie,我能够简单地阅读它:

$cookies.get("MySSOCookie");

但是要删除(当我希望将用户重新定向回到身份验证登陆屏幕时,例如在注销或超时时,我只是通过使用undefined覆盖来完成),我不得不确切地说:

$cookies.put('MySSOCookie', undefined, {domain: '.myCompanyName.com', path: '/'});

答案 1 :(得分:0)

使用原生javascript,这里有些功能可以帮到你:

//set cookies that you need
function setCookie(name, value, expires){
    document.cookie = name + "=" + escape(value) + "; ";

    if(expires){
        expires = setExpiration(expires);
        document.cookie += "expires=" + expires + "; ";

    }
}
//expiration of your cookie
function setExpiration(cookieLife){
    var today = new Date();
    var expr = new Date(today.getTime() + cookieLife * 24 * 60 * 60 * 1000);
    return  expr.toGMTString();
}

//get cookie with namecookie...
function getCookie(w){
   cName = "";
   pCOOKIES = new Array();
   pCOOKIES = document.cookie.split('; ');

       for(bb = 0; bb < pCOOKIES.length; bb++){
          NmeVal  = new Array();
          NmeVal  = pCOOKIES[bb].split('=');
          if(NmeVal[0] == w){
             cName = unescape(NmeVal[1]);
          }
       }
  return cName;
}

对于您的问题使用:

  setCookie(nameyourcookie,'')

我帮助过你......

答案 2 :(得分:0)

你能用:

$ cookieStore.remove(&#39;持续性&#39);

http://docs.angularjs.org/api/ngCookies/service/$cookieStore

答案 3 :(得分:0)

如果您的Cookie标记为httpOnly,则可能存在潜在问题。 HttpOnly cookies不能被任何JavaScript阅读。要查看您是否可以阅读cookie,请尝试:

$ document.cookie

在你的控制台中。如果尽管浏览器中存在cookie,它返回一个空字符串,那么这些cookie可能是httpOnly。您还可以在chrome

的Resources选项卡中查找HTTP复选标记

要摆脱httpOnly属性,您可以看到服务器框架是否有一些选项。在nodejs / express中,您可以传递这样的标志:

app.use(express.cookieSession({cookie: { httpOnly: false }}));

但是,我不知道这是不是很糟糕的做法,因为它看起来似乎是我们正在谈论的某种会话cookie,应由服务器处理。