我将Jetty服务器配置为允许跨域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,
...
}
错误功能始终触发。 有谁知道问题可能是什么?
答案 0 :(得分:5)
由于默认允许的标头是
X-请求-随着,内容类型,接受,起源
我必须添加标题
授权,内容类型
通过日志文件找到这个
DEBUG [2012-05-27 17:04:02,468] org.eclipse.jetty.servlets.CrossOriginFilter:标题[authorization,content-type]不在允许的标题中[X-Requested-With,Content-Type,接受,原产地]
感谢所有提示!
答案 1 :(得分:3)
您在应用程序中设置的响应标头 - 未启用安全性时00正常工作,正如您所证明的那样。但是,启用安全性后,您的跨域请求将失败。
这可能是由于安全过滤器设置的额外过滤器和其他响应标头,以便生成响应。
要解决此问题,高级解决方案是您必须在安全过滤器设置其响应标头和/或将其提交给客户端之前设置您的响应标头。
你也在使用Jetty;因此,您可以使用Jetty Cross Origin Filter确保响应标头在过滤器链中按照需要设置的顺序进行设置:
以下是可以传递到web.xml中的过滤器配置的参数列表:
allowedOrigins,允许访问资源的逗号分隔的源列表。默认值为*,表示所有来源
allowedMethods,一个逗号分隔的HTTP方法列表,允许在访问资源时使用。默认值为GET,POST
allowedHeaders,一个逗号分隔的HTTP标头列表,允许在访问资源时指定。默认值为X-Requested-With
preflightMaxAge,客户端可以缓存预检请求的秒数。默认值为1800秒,或30分钟
allowCredentials,一个布尔值,指示资源是否允许具有凭据的请求。默认值为false
默认情况下,Allowed Origins响应标头设置为*
,这意味着默认情况下,可以从任何域发出任何请求。假设您不希望所有域的每个请求都有效,您需要确保修改此选项以仅允许您打算列入白名单的域:
过滤器的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>
以下是您可能会发现有助于解决此特定问题的其他资源的列表:
HttpServletResponseWrapper javadoc - 如果您需要覆盖HttpServletResponse对象,可能需要这样做。
Differences between ServletResponse and HttpServletResponseWrapper?
答案 2 :(得分:0)
对于SOAP内容,允许的头文件还应包含messagetype,soapaction
请注意,不允许使用通配符来配置允许的标头...