我有一个移动web应用程序,它需要基本的身份验证。我设法在不同域的服务器上使用Ajax调用了基本身份验证。然而,我对回应有意见。
通常,Ajax响应会通过setcookie头在浏览器中设置会话id。我注意到,成功进行身份验证时不会发生这种情况。
我所做的是尝试在返回响应时通过读取标头手动设置cookie。我通过jQuerysjqxhr对象实现了这一点。令我惊讶的是,尽管服务器指示返回了sessionID,但我无法通过jqxhr在响应中看到任何设置的cookie头。
这是跨域请求的预期行为吗?某些响应标头会被丢弃?这是浏览器的安全功能吗?如果是这样的话,你会建议如何解决这个问题(例如,在正文中返回会话id,我不想这样做,因为我在后台使用Shiro安全过滤器来处理这个问题,我不需要破解它)?
请帮助
您不能使用ajax请求跨域uri。您必须实现自己的服务器端代理,它将处理远程身份验证服务器的请求/响应。它可以只是复制/粘贴响应,但它必须与您的客户端位于同一域中。
Cookie也是如此,它们有一个可以读/写的域。
您将被授权只请求此代理。它还可以处理cookie创建过程,然后将cookie id返回给客户端。
例如,在www.auth.com上,您可以获得以下Web服务:
url : www.auth.com/auth
@params : string uuid, string password
@returns : int shiroSessionId // yes it's more complicated, but KISS for the example
您应该在www.mydomain.com/myAuth上创建一个类,该类使用相同的参数设置www.auth.com/auth服务,并创建本地会话cookie
url : /myAuth
@params : string uuid, string password
@returns : int cookieId, -1 if login failed
最后在www.mydomain.com/login.html中,您将得到以下js调用(在jquery中):
$.ajax(function() {
url : '/myAuth',
date : {uuid: inputUuid, password: inputPassword}, // provided by a form
success(cookieId) {
if(cookieId > 0) {
alert('logged with cookie '+getCookie(cookieId));
} else {
alert('login failed');
}
}
});
希望能有所帮助。
问候