2017-02-14 3 views
2

Использование угловой и весенней загрузки мы пытаемся добавить аутентификацию к нашему сервису, но по какой-то причине мы не можем «открыть» и извлечь данные с URL-адреса, который, как мы знаем, работаетОтвет на предполетный период имеет неверный код состояния HTTP: 401 угловой

угловые:

this.getMismatches = function() { 
    return $http({ 
      "async": true, 
      "crossDomain": true, 
      "url": GLOBALS.mismatchUrl, 
      "method": "GET", 
      "headers": { 
       "authorization": "Basic YWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU=" 
     } 
    }); 
} 

(в настоящее время маркер Логин закодирована для целей тестирования) службы

отдыха:

@CrossOrigin(origins = "*") 
@RequestMapping("/api/mismatch") 
public List<Mismatch> home() { 
    return service.getAll(); 
} 

CrossOrigin = * должен заботиться о проблеме CORS, но этот неудачный URL-адрес действительно странный.

Дополнительные вещи, которые мы уже пробовали:

'Access-Control-Allow-Methods', 'GET, POST, OPTIONS' 
'Access-Control-Allow-Origin', '*' 
'Content-Type', json plaintext jsonp etc 

App.js: 
    $httpProvider.defaults.headers.common = {}; 
    $httpProvider.defaults.headers.post = {}; 
    $httpProvider.defaults.headers.put = {}; 
    $httpProvider.defaults.headers.patch = {}; 
+0

Что такое 'GLOBALS.mismatchUrl'? Я бы предположил, что он не говорит «Недействительный URL» без всякой причины ... –

+0

Плохо, отправил неправильное сообщение об ошибке. – Laurens

+0

вы можете получить ответ в почтальоне? –

ответ

7

Вы упоминали в своих комментариях, что с помощью почтальона вы можете получить ответ, как и ожидалось. Это хорошая отправная точка. Я подозреваю, что с помощью команды curl curl -i -X URL с терминала также возвращает правильный ответ.

Если почтальон работает правильно, вы должны знать, что прямо перед тем, как сделать запрос угловым, отправляется другой запрос, который запрашивает запрос перед полетом, который выполняет минимальную проверку конечной точки на стороне сервера.

Этот запрос является запросом типа ОПЦИИ.

Во-первых, вы должны убедиться, что ваш DispatcherServlet принимает OPTIONS запросы. Вы можете достичь этого либо указав его в файле с *.properties конфигурации, такие как:

spring.mvc.dispatch-options-request=true 

или настроив web.xml

После настройки его принять OPTIONS запросы, создать Filter.java и настроить фильтр CORS.

Вы можете направлять по следующему примеру:

public class CorsFilter implements Filter{ 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException { 

    if(response instanceof HttpServletResponse){ 
     HttpServletResponse alteredResponse = ((HttpServletResponse)response); 
     addCorsHeader(alteredResponse); 
    } 

    filterChain.doFilter(request, response); 
} 

private void addCorsHeader(HttpServletResponse response){ 
    //TODO: externalize the Allow-Origin 
    response.addHeader("Access-Control-Allow-Origin", "*"); 
    response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); 
    response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); 
    response.addHeader("Access-Control-Max-Age", "1728000"); 
} 

@Override 
public void destroy() {} 

@Override 
public void init(FilterConfig filterConfig)throws ServletException{} 
} 

В конце концов, не забудьте добавить этот фильтр в web.xml вместе со следующей инициализации-Params.

<filter> 
    <filter-name>cors-filter</filter-name> 
    <filter-class>ai.surge.usrmngmtservice.util.cors.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,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposed.headers</param-name> 
     <param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <!--<init-param>--> 
     <!--<param-name>cors.preflight.maxage</param-name>--> 
     <!--<param-value>1800</param-value>--> 
    <!--</init-param>--> 
</filter> 

Вы должны быть готовы к работе.