身份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和标准的不存在时,第二个)