Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
身份验证标头未发送JQuery Ajax_Ajax_Web Services_Jquery_Authentication - Fatal编程技术网

身份验证标头未发送JQuery Ajax

身份验证标头未发送JQuery Ajax,ajax,web-services,jquery,authentication,Ajax,Web Services,Jquery,Authentication,我的web服务器托管在Apache Tomcat 7中,具有基本身份验证。我有Tomcat用户“Tomcat”,角色为“Tomcat”,密码为“Tomcat”。下面是我在客户端的web.xml文件和脚本片段 Web.xml <?xml version="1.0" encoding="ASCII"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/

我的web服务器托管在Apache Tomcat 7中,具有基本身份验证。我有Tomcat用户“Tomcat”,角色为“Tomcat”,密码为“Tomcat”。下面是我在客户端的web.xml文件和脚本片段

Web.xml

<?xml version="1.0" encoding="ASCII"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>testservice</display-name>
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>testservice</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>testservice</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>testservice</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>tomcat</role-name>
        </auth-constraint>

        <user-data-constraint>
            <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE -->
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>
</web-app>

测试服务
生成JAX-RS工具-不修改
测试服务
com.sun.jersey.spi.container.servlet.ServletContainer
1.
测试服务
/休息/*
测试服务
/*
得到
邮递
雄猫
没有一个
基本的
客户端脚本:

<script src="jquery-1.10.2.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
    $.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);
        }
    });                    
</script>

$.ajax({
键入:“获取”,
发送前:功能(请求)
{
setRequestHeader(“授权”,“基本dG9tY2F0OnRvbWNhdA==”;
},
url:“http://localhost:1222/testservice/rest/test/users",
数据类型:“jsonp”,
成功:功能(res){
警报(res);
},
错误:函数(err){
警惕(err);
}
});                    
我很确定Web服务和基本身份验证没有问题。但在客户端脚本中,不发送任何身份验证头。我也尝试了
标题:(“授权”,“基本dG9tY2F0OnRvbWNhdA==”)
。但是请求发送时没有身份验证头。任何帮助都将不胜感激。

有两件事可以尝试:

1) 将CORS过滤器添加到Tomcat配置中 将添加到Tomcat配置中。注意
访问控制允许来源
故意在下面留空,因此没有站点可以通过CORS访问。但是配置的重要参数是
访问控制允许凭据

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value></param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
我注意到的另一件事是,您的web.xml可能还需要以下内容:

<security-role>
  <role-name>tomcat</role-name>
</security-role>

雄猫

希望这有帮助。

发现通过头传递身份验证不适用于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%的问题,我们改变了如何设置withCredentials属性,这对我们很有效。请注意,我们设置了xhrFields属性。这可以在这里ajax方法的jQuery文档中看到


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

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

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

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

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

来自客户端的请求标头不包含授权条目(检查网络流量)。在浏览器中进行测试时,它会请求凭据。是的,JS请求的行为与浏览器请求不同。您是说您进行了上述更改,但仍然没有传递任何授权标头?通过标头传递身份验证不适用于jQuery ajax和jsonp数据排版请求。withCredentials=true;在beforeSend中,方法对我不起作用。我们最终在ajax属性中更明确地设置了它,比如so$.ajax({type:“GET”,xhrFields:{withCredentials:true}),这很有效。希望这对其他人有所帮助!您的“success”键拼写错误为“success”顺便说一句,在ajax调用中,@kuanb,你是对的,但这对这种情况没有任何帮助。你能解释一下你所做的更改吗?@kuanb,通过url传递凭证。(tomcat作为用户名和密码)
$.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);
    }
});
beforeSend: function (jqXHR, settings) {
    if (self._hasAuthInfo()) {
        jqXHR.setRequestHeader("Authorization", self._makeAuthHeader());
        jqXHR.setRequestHeader("IEAuth", self._makeAuthHeader());
    }
}