Ответ на предварительную проверку имеет неверный код состояния HTTP: 401 angular

Используя angular и Spring Boot, мы пытаемся добавить аутентификацию в нашу службу, но по какой-то причине мы не можем «открыть» и получить данные с URL-адреса, который, как мы знаем, работает.

Угловой:

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 = {};

person Laurens    schedule 14.02.2017    source источник
comment
На что настроено GLOBALS.mismatchUrl? Я полагаю, что он не говорит «Неверный URL-адрес» без всякой причины...   -  person Brother Woodrow    schedule 14.02.2017
comment
Мой плохой, опубликовал неправильное сообщение об ошибке.   -  person Laurens    schedule 14.02.2017
comment
Вы можете получить ответ в почтальоне?   -  person bipin patel    schedule 14.02.2017
comment
Да, это самая странная часть.   -  person Laurens    schedule 14.02.2017
comment
можете ли вы указать значение «GLOBALS.mismatchUrl»?   -  person bipin patel    schedule 14.02.2017
comment
172.31.20.14:8080/api/getFoo   -  person Laurens    schedule 14.02.2017


Ответы (1)


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

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

Это запрос типа OPTIONS.

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

spring.mvc.dispatch-options-request=true

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

<servlet>
    <!--content eluded for clarity-->
    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

После того, как вы настроили его для приема запросов 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 вместе со следующими параметрами инициализации.

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

Вы должны быть готовы идти сейчас.

person flashjpr    schedule 14.02.2017