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

请注意,不允许使用通配符来配置允许的标头…

Interesting Posts