>我将我的 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,
...
}
错误函数始终触发。有人知道问题可能是什么吗?
因为默认允许的标头是
X-请求,内容类型,接受,来源
我不得不添加标题
授权,内容类型
通过日志文件找到这个
调试 [2012-05-27 17:04:02,468] org.eclipse.jetty.servlets.CrossOriginFilter:标头 [授权,内容类型] 不在允许的标头中 [X-Request-With, Content-Type, Accept, Origin]
感谢您的所有提示!
正如您所证明的那样,您在应用程序中设置的响应标头 - 当安全性未启用时 00 工作正常。但是,启用安全性后,跨域请求将失败。
这可能是由于安全过滤器为生成响应而设置了额外的筛选器和额外的响应标头。
若要解决此问题,高级解决方案是必须在安全筛选器设置其响应标头和/或将其提交到客户端之前设置响应标头。
您也在使用 Jetty;因此,您可以使用 Jetty 跨源筛选器来确保响应标头按需要设置的顺序在筛选器链中设置:
以下是可以传递到 Web 中的过滤器配置的参数列表.xml:
allowOrigins,一个以逗号分隔的允许访问资源的源列表。默认值为 *,表示所有原点
allowMethods,以逗号分隔的 HTTP 方法列表,允许在访问资源时使用这些方法。默认值为 GET,POST
allowedHeaders,一个逗号分隔的 HTTP 标头列表,允许在访问资源时指定这些标头。默认值为 X 请求方式
preflight MaxAge,客户端可以缓存预检请求的秒数。默认值为 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>
以下是您可能会发现有助于解决此特定问题的其他资源列表:
码头交叉原产地过滤器
访问控制允许源不允许
Java EE 5 教程 - 过滤请求和响应
HttpServletResponseWrapper javadoc - 如果您需要覆盖 HttpServletResponse 对象,您可能需要它。
通过过滤器在 Servlet 中设置认证标头
ServletResponse 和 HttpServletResponseWrapper 之间的区别?
如何基于内容类型添加响应标头;在提交响应之前获取内容类型
对于 SOAP 的东西,允许的标头还应该包括 messagetype,soapaction
请注意,不允许通配符配置允许的标头...