1

在我的 Webapp(运行于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我的 webapp 中的变量为空。我也尝试从and读取document.cookie变量,但它始终为空。我尝试的另一件事是用localhost/myApp/my.module/localhost/my.module/

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

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

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

4

1 回答 1

1

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

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

于 2013-09-11T06:48:21.130 回答