【问题标题】:Javascript: remove a cookie that was set by an ajax responseJavascript:删除由 ajax 响应设置的 cookie
【发布时间】:2013-09-11 15:03:10
【问题描述】:

在我的 Web 应用程序(在 localhost/myApp/ 运行)中,我有一个 ajax 调用,例如:

$.ajax({
    type: "GET",
    url: "http://localhost:8080/my.module/Login/login?user=abc&password=123",
    xhrFields: {
        withCredentials: true,
    },
    success: onResult,
    error: onError,
});

登录服务器。如果登录成功,服务器会以布尔值响应,并且响应还包含此标头:

Set-Cookie: JSESSIONID=167C57FA1E3529433938E744F7C4AC52; Path=/my.module

使用之前设置的 xhrField "withCredentials: true",浏览器会自动处理 cookie 并在所有后续请求中附加 Cookie 标头:

Cookie: JSESSIONID=167C57FA1E3529433938E744F7C4AC52

这工作得很好。但是现在我遇到了问题,服务器有一个错误,因此在调用注销接口时它不会删除会话,会话无法关闭(并且我无权访问服务器)。为了正确注销,我必须删除客户端上的会话 cookie,以便从服务器获取一个新的。但我找不到访问或删除 cookie 的方法,document.cookie 变量在我的 web 应用程序中为空。我还尝试从localhost/myApp/my.module/localhost/my.module/ 中读取document.cookie 变量,但它始终为空。我尝试的另一件事是用

覆盖cookie
document.cookie = "JSESSIONID=ABC; Path=/my.module";

但服务器请求仍然具有之前的 cookie。谁能告诉我如何删除它?

我知道这个解决方案会是一个 hack,但这正是我正在寻找的,因为服务器程序员无法及时修复错误并要求我在客户端实现这样的 hack。

【问题讨论】:

  • 这可能是一个仅限 HTTP 的 cookie!我认为你必须在服务器端删除它
  • cookie 将设置在服务器端。如果你不能删除它,你可以使你的会话无效吗?
  • 服务器响应头中没有HttpOnly标志。
  • @Salketer - 运行 js 的应用程序可以是另一个应用程序的一部分,该应用程序使用另一个应用程序提供的服务(在这种情况下是服务器)。
  • @user1448982 您应该联系可以更改服务器应用程序的人员。任何其他实现都将是解决该问题的 hacky 解决方案。

标签: javascript ajax cookies


【解决方案1】:

“无法通过非 HTTP 方法访问 HttpOnly cookie,例如通过 JavaScript 调用” -http://en.wikipedia.org/wiki/HTTP_cookie#Secure_and_HttpOnly

首先,客户端 javascript 不应该关心 cookie。
当服务器看到登录请求时,它会创建一个新的 cookie 并调用 Set-Cookie。
在收到任何其他 ajax 请求时,服务器会在处理请求之前验证当前 cookie。
在注销请求时,它将从其(服务器的)会话信息中清除 cookie,即来自具有相同 cookie 的客户端的任何进一步请求都将失败,因为它不在服务器存储中。

【讨论】:

  • 是的,我知道,但是服务器的程序员要求我在注销时删除客户端上的cookie,因为他们在服务器上有一个bug,无法及时修复,所以服务器不会在注销时清除 cookie。这就是我在这里问这个问题的原因。
  • 然后告诉他们在响应中设置一个空 cookie ......让我们说一个注销操作。
猜你喜欢
  • 2013-02-21
  • 2011-03-21
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2013-03-02
  • 2016-05-22
  • 2012-04-06
相关资源
最近更新 更多