从其他域返回Ajax请求时设置cookie



我有一个移动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');
    }
  }
});

希望能有所帮助。

问候

相关内容

  • 没有找到相关文章

最新更新