jQuery的跨域认证(jquery cross domain authentication)

2019-07-29 13:40发布

我配置我的码头服务器以允许跨域的HTTP请求(allowedOrigins = *),也允许使用其CrossOriginFilter跨域认证(allowCredentials = TRUE)。 跨域HTTP请求没有身份验证的要求工作正常。 现在,当它涉及到HTTP,要求认证调用它不工作了使用JQuery。 我用下面的代码,并遵循这个例子: http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/

function login(username, password) {
$.ajax({
    type: "GET",
    contentType: "application/json",
    dataType: "json",
    url: url,
    beforeSend: function(xhr) {
        var base64 = Base64.encode(username + ":" + password);
        xhr.setRequestHeader("Authorization", "Basic " + base64);
        xhr.withCredentials = true;
    },
    error: function(data){
        alert("error");
    },
    success: function(data){
        alert("success"); 
    }
});

在是HttpFox我看到下面的请求到服务器:

OPTIONS /login HTTP/1.1
...
Access-Control-Request-Method   GET
Access-Control-Request-Headers  authorization,content-type

该服务器有响应

HTTP/1.1 204 No Content
...
Allow   OPTIONS,GET,HEAD

我也用下面的选项,这犯规有所作为。

$.ajax({
    ...
    username: username,
    password: password,
    ...
}

误差函数始终闪光。 任何人的想法的问题可能是什么?

Answer 1:

作为默认允许的标题是

X-要求-着,内容类型,接受,产地

我不得不添加标题

授权,内容类型

通过日志文件中找到这

DEBUG [2012-05-27 17:04:02468] org.eclipse.jetty.servlets.CrossOriginFilter:集管[授权,内容类型]不允许头中[X-请求-随着,内容类型,接受,起源]

感谢所有的提示!



Answer 2:

当安全性未启用00作品就好了,因为你已经证明了这一点 - 你在你的应用程序设置的响应头。 但是,当启用安全性时,您的跨域请求失败。

这可能是由于由安全过滤器,以产生一个响应设置附加的过滤器和另外的响应报头。

为了解决这个问题,高层次的解决方案是,你必须在此之前,保安过滤器设置它的响应头和/或将它们提交给客户端的时间设置你的响应头。

您还使用码头; 因此,你可以使用码头跨源过滤器 ,以确保响应报头中的过滤器链设置,因为它们需要设置的顺序:

这里是一个可以传递到web.xml中的过滤器配置参数列表:

  • allowedOrigins,用逗号分隔的被允许访问的资源来源的列表。 默认值是*,这意味着所有的起源

  • allowedMethods,逗号分隔的被允许访问的资源时所使用的HTTP方法列表。 默认值是GET,POST

  • allowedHeaders,逗号分隔被允许访问该资源时要指定的HTTP报头的列表。 默认值是X-要求,随着

  • preflightMaxAge,即预检要求可以由客户端缓存的秒数。 缺省值为1800秒,或30分钟

  • allowCredentials,布尔值,指示如果资源允许与证书请求。 默认值为false

缺省情况下,允许起源响应首部设置为* ,这意味着在默认情况下,任何请求可以来自任何域制成。 你需要一定要修改这个只允许您打算到白名单域,假设你不希望从所有域的每个请求是有效的:

对于过滤器的web.xml条目:

<web-app ...>
    ...
    <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>

下面是你可能会发现在解决这方面的问题有帮助的其他资源列表:

  • 码头跨源过滤器

  • 访问控制允许ORIGIN不容许

  • Java EE 5个教程-过滤请求和响应

  • HttpServletResponseWrapper的javadoc -您可能需要这你需要重写HttpServletResponse对象的情况。

  • 通过过滤器在Servlet中设置认证报头

  • ServletResponse的和HttpServletResponseWrapper之间的差异?

  • 如何根据内容类型添加响应头; 获得内容类型前提交响应



Answer 3:

对于SOAP的东西,在允许的标题还应该包括为messageType,SOAPAction的

要注意的是没有通配符允许配置允许的头...



文章来源: jquery cross domain authentication