在我的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
这完全没问题。但是现在我遇到了问题,服务器有一个bug,因此在调用注销界面时不会删除会话,会话无法关闭(我无法访问服务器)。为了正确注销,我必须删除客户端上的会话cookie,这样我才能从服务器上获取一个新的会话cookie。但我无法找到访问或删除cookie的方法,document.cookie
变量在我的webapp中为空。我还尝试阅读document.cookie
和localhost/myApp/my.module/
中的localhost/my.module/
变量,但它始终为空。我尝试的另一件事是用
document.cookie = "JSESSIONID=ABC; Path=/my.module";
但服务器请求仍然具有之前的cookie。谁能告诉我如何删除它?
我知道这个解决方案会是一个黑客,但这就是我正在寻找的,因为服务器程序员无法及时修复bug并要求我在客户端实现这样的黑客攻击。
答案 0 :(得分:1)
“无法通过非HTTP方法访问HttpOnly cookie,例如通过JavaScript调用” - http://en.wikipedia.org/wiki/HTTP_cookie#Secure_and_HttpOnly
首先,客户端javascript不应该关心cookie 当服务器看到登录请求时,它会创建一个新的cookie并调用Set-Cookie 收到任何其他ajax请求后,服务器会在提供请求之前验证当前cookie 在注销请求时,它将从其(服务器的)会话信息中清除cookie,即来自具有相同cookie的客户端的任何进一步请求将失败,因为它不在服务器存储中。