2013-12-05 2 views
0

Я просто настраиваю небольшой TestScenario. Я разоблачаю службу REST на Tomcat 7 с Джерси. Услуга вызывается другим приложением Javascript/HTML5 через XMLHttpRequest. Для тестирования я просто запускаю службу REST в моей установке eclipse с помощью Tomcat.Tomcat7 REST Service с базовой аутентификацией XMLHttpRequest

Вызов службы REST из JavaScript работает отлично, без настройки подлинности.

Теперь я пытаюсь добавить механизм базовой аутентификации в службы REST. В 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> 

Вызов URL-адреса REST из браузера работает нормально. Он запрашивает пользователя и пароль, затем отображается ответ службы REST.

Но когда я пытаюсь вызвать его из JavaScript, со следующей snipplet я получаю всегда 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 

Код Snipplet настоящее время я использую:

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

Что я делаю неправильно? Я совершенно смущен, почему теперь после добавления аутентификации браузер жалуется на отсутствие заголовка управления доступом. Перед добавлением аутентификации в службу звонок также работает с CORS.

Что я вижу из HTTP-запроса, что заголовок основной проверки подлинности, кажется, настроен правильно.

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 ошибочен.

ответ

2

Я не знаю, удалось ли решить проблему, но я столкнулся с той же проблемой и отладил через org.apache.catalina.filters.CorsFilter, чтобы выяснить, почему запрос был запрещен.

В соответствии с W3 CORS Spec Section 6.2 Preflight Requests предполетный срок должен отклонить запрос, если какой-либо представленный заголовок не соответствует разрешенным заголовкам.

default configuration for the CorsFiltercors.allowed.headers (как ваш) не включает заголовок Authorization, который отправляется с запросом.

Я обновил настройку фильтра , чтобы принять заголовок authorization, и запрос предварительной проверки теперь успешно выполнен.

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

Спасибо, за ваш ответ. Оно работает ! Я добавил заголовок авторизации в разрешенные заголовки, и теперь он работает. Отлично. –

Смежные вопросы