gpt4 book ai didi

rest - 具有基本身份验证 XMLHttpRequest 的 Tomcat7 REST 服务

转载 作者:行者123 更新时间:2023-11-28 22:43:04 26 4
gpt4 key购买 nike

我只是在设置一个小的 TestScenario。我正在使用 Jersey 在 Tomcat 7 上公开 REST 服务。该服务由另一个 Javascript/HTML5 应用程序通过 XMLHttpRequest 调用。为了进行测试,我只是在 Tomcat 安装的 eclipse 中运行 REST 服务。

无需任何身份验证设置即可从 JavaScript 调用 REST 服务。

现在我正在尝试将基本身份验证机制添加到我的 REST 服务中。在我的 web 项目的 web.xml 中,我添加了

 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ImageLinksServices</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.xxx.xxx.services</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>



<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,DELETE</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>

<security-constraint>
<web-resource-collection>
<web-resource-name>Wildcard means whole app requires authentication</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>tomcat1</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>

从浏览器调用 REST URL 工作正常。他要求输入用户名和密码,然后显示 REST 服务的响应。

但是当我尝试使用以下代码片段从 Javascript 调用它时,我总是收到 403 错误和警告

OPTIONS http://localhost:10080/xxxx/rest/fileupload No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access

我目前正在使用的代码片段:

xhr.open('POST', url, true);
//xhr.open("POST", url, true, "user1", "tomcat1");
xhr.setRequestHeader("Authorization","Basic "+ btoa("user1:tomcat1"));
xhr.withCredentials = "true";
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var jsonResponse = JSON.parse(xhr.responseText);

我做错了什么?我完全不明白为什么现在在添加身份验证后浏览器提示没有访问控制 header 存在。在向服务添加身份验证之前,调用也适用于 CORS。

我从 HTTP 请求中可以看出,基本身份验证 header 似乎设置正确。

    Request URL:http://localhost:10080/xxx/rest/fileupload
Request Method:OPTIONS
Status Code:403 Forbidden
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:authorization, content-type
Access-Control-Request-Method:POST
Authorization:Basic dXNlcjE6dG9tY2F0MQ==
Connection:keep-alive
Host:localhost:10080
Origin:http://localhost:63342
Referer:http://localhost:63342/xxx/html/index.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Response Headersview source
Content-Length:0
Content-Type:text/plain
Date:Thu, 05 Dec 2013 12:58:46 GMT
Server:Apache-Coyote/1.1

任何人都可以帮助我理解我做错了什么。如果 Tmocat 配置是 mssing 或我的 Javascript 错误,我感到很困惑。

最佳答案

我不知道你是否设法解决了你的问题,但我遇到了同样的问题并通过 org.apache.catalina.filters.CorsFilter 进行调试以找出请求的原因被禁止。

根据W3 CORS Spec Section 6.2 Preflight Requests ,如果提交的任何 header 与允许的 header 不匹配,预检必须拒绝请求。

default configuration for the CorsFilter cors.allowed.headers(和你的一样)不包括随请求一起提交的 Authorization header 。

我更新了 cors.allowed.headers 过滤器设置以接受 authorization header ,预检请求现已成功。

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<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>
</filter>

关于rest - 具有基本身份验证 XMLHttpRequest 的 Tomcat7 REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com