首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Ajax请求将基本身份验证详细信息发送到Tomcat9 web服务

使用Ajax请求将基本身份验证详细信息发送到Tomcat9 web服务
EN

Stack Overflow用户
提问于 2018-03-28 21:52:15
回答 1查看 56关注 0票数 0

我正在尝试通过JQuery/Ajax从另一台服务器调用Java/Spring web服务

单击按钮将触发代码:

代码语言:javascript
运行
复制
var request = $.ajax({
                xhrFields: {
                    withCredentials: true
                },
                method: "GET",
                url: "http://<ipOfWebService>/api/myEndPoint/4313991?country=UK",
                dataType: "xml",
                crossDomain: true,
                username: "basicUsername",
                password: "basicPassword",
            })

我已经根据Tomcat docs配置了CORS过滤器,将domainOfAjaxCall指定为允许的源:

代码语言:javascript
运行
复制
  <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>ipAddress1,http://dev.ajaxCaller.com</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,Authorization</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服务之前,系统会提示我输入用户名/密码:

我见过的大多数帖子都建议用beforeSend替换用户名和密码,例如

代码语言:javascript
运行
复制
      beforeSend: function(xhr) {
             xhr.setRequestHeader("Authorization", "Basic " + btoa( "basicUsername:basicPassword"))
        },

不幸的是,尽管配置了CORS过滤器,但仍会导致错误:

代码语言:javascript
运行
复制
Failed to load http://<ipOfWebService>/api/myEndPoint/4313991?country=UK: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '<domainOfAjaxCall>' is therefore not allowed access. The response had HTTP status code 401.

我还尝试将beforeSend切换为:

代码语言:javascript
运行
复制
headers: {
"Authorization": "Basic " + btoa("basicUsername:basicPassword")

},

结果是一样的。

我哪里错了?

EN

回答 1

Stack Overflow用户

发布于 2018-03-28 22:09:30

使用CORS头向您的web服务添加OPTIONS方法,并将"Access-Control-Allow-Headers“设置为"Authorization”。

这应该行得通!

为什么?

在跨域请求中使用Auth headers时,会先向OPTIONS方法发送请求。如果OPTIONS有正确的头文件,它将转到你的请求中的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49536408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档