身份validation标头不发送JQuery Ajax

我在Apache Tomcat 7中托管了带有基本身份validation的Web服务器。 我有Tomcat用户’tomcat’,角色’tomcat’,密码’tomcat’。 以下是我在客户端的web.xml文件和脚本片段。

在web.xml

  testservice  JAX-RS Tools Generated - Do not modify testservice com.sun.jersey.spi.container.servlet.ServletContainer 1   testservice /rest/*    testservice /* GET POST   tomcat    NONE    BASIC   

客户端脚本:

   $.ajax({ type: "GET", beforeSend: function (request) { request.setRequestHeader("Authorization", "Basic dG9tY2F0OnRvbWNhdA=="); }, url: "http://localhost:1222/testservice/rest/test/users", dataType:"jsonp", success: function(res) { alert(res); }, error: function(err) { alert(err); } });  

我很确定Web Service和Basic身份validation没有问题。 但是从客户端脚本,没有发送身份validation标头。 我试过header:("Authorization","Basic dG9tY2F0OnRvbWNhdA==") 。 但请求是在没有身份validation标头的情 任何帮助将不胜感激。

要尝试两件事:

1)将CORSfilter添加到Tomcat配置中

将CORS Filter添加到Tomcat配置中。 注意Access-Control-Allow-Origins在下面故意留空,因此没有站点可以通过CORS访问。 但是配置的重要参数是Access-Control-Allow-Credentials

  CorsFilter org.apache.catalina.filters.CorsFilter  cors.allowed.origins    cors.allowed.methods GET,POST,HEAD,OPTIONS,PUT   cors.allowed.headers Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers   cors.exposed.headers Access-Control-Allow-Origin,Access-Control-Allow-Credentials   cors.support.credentials true   cors.preflight.maxage 10    CorsFilter /*  

2)修改您的Ajax调用

在你的ajax调用中修改你的beforeSend ,如下所示:

 $.ajax({ type: "GET", beforeSend: function (request) { request.withCredentials = true; request.setRequestHeader("Authorization", "Basic dG9tY2F0OnRvbWNhdA=="); }, url: "http://localhost:1222/testservice/rest/test/users", dataType:"jsonp", success: function(res) { alert(res); }, error: function(err) { alert(err); } }); 

我注意到的另一件事是你的web.xml可能还需要以下内容:

  tomcat  

希望这可以帮助。

发现通过头传递身份validation不适用于jQuery ajax和jsonp数据类型。 所以试过以下并且工作正常。

 $.ajax({ type: "GET", url: "http://tomcat:tomcat@localhost:1222/testservice/rest/test/users", dataType:"jsonp", success: function(res) { alert(res); }, error: function(err) { alert(err); } }); function callbackMethod(data) { alert(data); } 

mccannf让我们99%的方式有类似的问题hover我们切换了我们如何设置withCredentials属性,这对我们有用。 注意我们设置了xhrFields属性。 这可以在这里的ajax方法的jQuery文档中看到; http://api.jquery.com/jQuery.ajax/

 $.ajax({ type: "GET", xhrFields: { withCredentials: true }, beforeSend: function (request) { request.setRequestHeader("Authorization", "Basic dG9tY2F0OnRvbWNhdA=="); }, url: "http://localhost:1222/testservice/rest/test/users", dataType:"jsonp", succes: function(res) { alert(ers); }, error: function(err) { alert(err); } }); 

但是,我们没有使用jsonp,简单的json。

我还没有找到解决方案,只有一个解决方法:

使用两个标头发送Authorization标头,标准标头和IE的自定义标头:

 beforeSend: function (jqXHR, settings) { if (self._hasAuthInfo()) { jqXHR.setRequestHeader("Authorization", self._makeAuthHeader()); jqXHR.setRequestHeader("IEAuth", self._makeAuthHeader()); } } 

服务器端将检查两者(仅当IE和标准的不存在时,第二个)