404 для метода OPTIONS в Google AppEngine с Java и Angular.js

Я использую Angular.js с AppEngine на Java.
Для каждого HTTP-запроса Angular.js выдает запрос OPTIONS перед фактическим запросом, который возвращает мне ошибку HTTP 404.
Может ли кто-нибудь объяснить мне почему?

В AppEngine, как включить конфигурацию для метода OPTIONS?

Изменить: я создал фильтр для обработки запроса OPTIONS. Теперь я добавляю заголовок Allow со значением GET, POST, DELETE, PUT, OPTIONS, HEAD и отвечаю кодом состояния 200. Но все равно показывает 404.


person Harikrishnan    schedule 11.01.2016    source источник
comment
это зависит от вашей серверной структуры. что вы используете? и это не просто включить, вам нужно написать обработчик для такого запроса. хотя может быть простой сервлет   -  person Igor Artamonov    schedule 11.01.2016
comment
Я использую Google App Engine с конечными точками Google Cloud.   -  person Harikrishnan    schedule 11.01.2016
comment
Теперь я отвечаю 200 OK с заголовками, установленными как Allow:GET, POST, DELETE, PUT, OPTIONS, HEAD. все равно показывает 404   -  person Harikrishnan    schedule 11.01.2016
comment
пожалуйста, покажите свой код. кроме того, сервлеты лучше подходят для этой задачи   -  person Igor Artamonov    schedule 11.01.2016


Ответы (1)


Наконец заработало. Я написал код следующим образом:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse resp = (HttpServletResponse) response;
    HttpServletRequest req = (HttpServletRequest) request;
    resp.setHeader("Cache-Control", "max-age=3600");
    resp.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    resp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
    resp.setHeader("Access-Control-Allow-Origin", "www.myapp.com");
    resp.setHeader("Access-Control-Allow-Credentials", "true");
    if (req.getMethod().equals("OPTIONS")) { 
        resp.flushBuffer();
    } else {
        chain.doFilter(request, resp);
    }
}

Я только что написал resp.setHeader("Access-Control-Allow-Origin", "*"); до. После написания всех заголовков все заработало.

person Harikrishnan    schedule 11.01.2016
comment
resp.setHeader("Access-Control-Allow-Origin", "*") не меняет поведение сервера для 404. и вам не нужно размещать заголовки CORS ни для чего, кроме OPTION. также происхождение '*' небезопасно - person Igor Artamonov; 11.01.2016
comment
Спасибо за ваше предложение. Я изменю это. - person Harikrishnan; 11.01.2016
comment
Спасибо, это сэкономило нам кучу времени! - person Deepan Prabhu Babu; 23.08.2018