jquery跨域身份validation
我将Jetty服务器配置为允许跨域http请求(allowedOrigins = *),并使用其CrossOriginFilter允许跨域身份validation(allowCredentials = true)。 没有身份validation要求的跨域http请求正常工作。 现在谈到需要身份validation的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
服务器以a响应
HTTP/1.1 204 No Content ... Allow OPTIONS,GET,HEAD
我也使用下面的选项,这没有什么区别。
$.ajax({ ... username: username, password: password, ... }
错误function总是触发。 有谁知道问题可能是什么?
默认允许的标头是
X-要求-着,内容类型,接受,产地
我不得不添加标题
授权,内容类型
通过日志文件找到了这个
DEBUG [2012-05-27 17:04:02,468] org.eclipse.jetty.servlets.CrossOriginFilter:标题[authorization,content-type]不在允许的标题中[X-Requested-With,Content-Type,Accept,Origin ]
谢谢你的所有提示!
您在应用程序中设置的响应标头 – 如果未启用安全性,00就可以正常运行,正如您所certificate的那样。 但是,启用安全性后,您的跨域请求将失败。
这可能是由于安全filter设置的额外filter和其他响应标头,以便生成响应。
要解决此问题,高级解决方案是您必须在安全筛选器设置其响应标头和/或将其提交到客户端之前设置响应标头。
你也在使用Jetty; 因此,您可以使用Jetty Cross Origin Filter确保响应标头在Filter链中按照需要设置的顺序设置:
以下是可以传递到web.xml中的Filter配置的参数列表:
allowedOrigins,允许访问资源的逗号分隔的起源列表。 默认值为*,表示所有来源
allowedMethods,一个逗号分隔的HTTP方法列表,允许在访问资源时使用。 默认值为GET,POST
allowedHeaders,一个逗号分隔的HTTP标头列表,允许在访问资源时指定。 默认值为X-Requested-With
preflightMaxAge,客户端可以缓存预检请求的秒数。 默认值为1800秒或30分钟
allowCredentials,一个布尔值,指示资源是否允许具有凭据的请求。 默认值为false
默认情况下,Allowed Origins响应标头设置为*
,这意味着默认情况下,可以从任何域发出任何请求。 假设您不希望所有域的每个请求都有效,您需要确保修改此选项以仅允许您打算列入白名单的域:
filter的web.xml条目:
... cross-origin org.eclipse.jetty.servlets.CrossOriginFilter cross-origin /* ...
以下是您可能会发现有助于解决此特定问题的其他资源的列表:
-
docker十字架filter
-
访问控制允许来源不被允许
-
Java EE 5教程 – 过滤请求和响应
-
HttpServletResponseWrapper javadoc – 如果需要覆盖HttpServletResponse对象,可能需要它。
-
通过Filter在Servlet中设置Authentication Header
-
ServletResponse和HttpServletResponseWrapper之间的区别?
-
如何根据Content-type添加响应头; 在提交响应之前获取Content-type
对于SOAP内容,允许的头文件还应包含messagetype,soapaction
请注意,不允许使用通配符来配置允许的标头…