2012-05-26 41 views
8

我配置我的码头服务器以允许跨域的HTTP请求(allowedOrigins = *),也允许跨域认证(allowCredentials =真)使用其CrossOriginFilter。 跨域http请求没有认证要求工作正常。现在谈到需要身份验证的http调用时,无法使用JQuery。我用下面的代码和接着这个例子:http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jQuery的跨域认证

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, 
    ... 
} 

错误函数总是激发。 任何人都知道问题可能是什么?

+0

你在你的响应头看到这个'访问控制 - 允许原产地:*'?顺便问一句好!欢迎来到StackOverflow! – jmort253

+0

我认为如果你能显示与这个问题相关的任何堆栈轨迹,这将会很有帮助。 – jmort253

+0

好的,请检查您的回复中是否包含该标题。如果不是,那么安全性可能会覆盖响应头。需要查看更多日志以进一步调试。祝你好运! :) – jmort253

回答

5

在默认允许的标题是

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

我必须通过日志文件来添加页眉

授权,内容类型

发现这个

DEBUG [2012-05-27 17:04 :02,468] org.eclipse.jetty.servlets.CrossOriginFilter:Headers [authorization,content-type]不在允许的标题中[X-Requested-With,Content-Type,Accept,Origin]

感谢您的所有提示!

3

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

这可能是由于额外的过滤器和另外的响应头由安全过滤器,以产生一个响应集。

要解决此问题,高级别的解决方案是您必须在安全筛选器设置其响应标头和/或将它们提交给客户端之前设置您的响应标头。

您还在使用Jetty;因此,您可以使用Jetty Cross Origin Filter以确保响应标头在过滤器链中按照需要设置的顺序进行设置:

以下是可以传递到Web中的过滤器配置的参数列表.XML:

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

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

  • allowedHeaders,被允许访问该资源时要指定的HTTP报头的逗号分隔的列表。缺省值为X请求 - 带有

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

  • allowCredentials,一个布尔值,指示如果资源允许与凭证请求。默认值是假

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

的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> 

这里是额外的资源列表,你会发现在解决这方面的问题有所帮助:

0

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

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