我配置我的码头服务器以允许跨域的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,
...
}
误差函数始终闪光。 任何人的想法的问题可能是什么?
作为默认允许的标题是
X-要求-着,内容类型,接受,产地
我不得不添加标题
授权,内容类型
通过日志文件中找到这
DEBUG [2012-05-27 17:04:02468] org.eclipse.jetty.servlets.CrossOriginFilter:集管[授权,内容类型]不允许头中[X-请求-随着,内容类型,接受,起源]
感谢所有的提示!
当安全性未启用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之间的差异?
如何根据内容类型添加响应头; 获得内容类型前提交响应
对于SOAP的东西,在允许的标题还应该包括为messageType,SOAPAction的
要注意的是没有通配符允许配置允许的头...