【问题标题】:Authentication headers are not sending JQuery Ajax身份验证标头未发送 JQuery Ajax
【发布时间】:2013-09-19 08:41:44
【问题描述】:

我有一个托管在 Apache Tomcat 7 中的 Web 服务器,带有基本身份验证。我有 Tomcat 用户“tomcat”,角色为“tomcat”,密码为“tomcat”。以下分别是我的 web.xml 文件和客户端的脚本 sn-p。

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>

客户端脚本:

<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>

我很确定 Web 服务和基本身份验证没有问题。但是从客户端脚本中,没有发送身份验证标头。我也试过header:("Authorization","Basic dG9tY2F0OnRvbWNhdA==")。但是请求发送时没有身份验证标头。任何帮助将不胜感激。

【问题讨论】:

  • 顺便说一句,在 ajax 调用中,您的“成功”键被拼写为“成功”。
  • @kuanb,你是对的,但无论如何这对这种情况无济于事。

标签: ajax web-services jquery authentication


【解决方案1】:

尝试两件事:

1) 将 CORS 过滤器添加到您的 Tomcat 配置中

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

<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>

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 可能还需要以下内容:

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

希望这会有所帮助。

【讨论】:

  • 来自客户端的请求标头不包含授权条目(检查了网络流量)。在浏览器中进行测试时,它要求提供凭据。
  • 是的,JS 请求的行为与浏览器请求不同。您是说您进行了上述更改,但仍然没有通过授权标头?
  • 通过标头传递身份验证不适用于具有 jsonp 数据类型的 jQuery ajax
  • 设置 request.withCredentials = true;在 beforeSend 方法对我不起作用。我们最终在 ajax 属性中更明确地设置它,就像这样 $.ajax({ type: "GET", xhrFields: { withCredentials: true } 这很有效。希望这对某人有所帮助!
【解决方案2】:

发现通过标头传递身份验证不适用于具有 jsonp 数据类型的 jQuery ajax。所以尝试了以下并且工作正常。

$.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);
}

【讨论】:

  • 你能解释一下你改变了什么吗?
  • @kuanb,通过 url 传递凭据。 (tomcat作为用户名和密码)
【解决方案3】:

mccannf 让我们完成了 99% 的工作,但出现了类似的问题,悬停我们切换了设置 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。

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 2019-02-21
      • 1970-01-01
      • 2022-10-25
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多