Подтвердить что ты не робот

AngularJS не обнаруживает заголовок Access-Control-Allow-Origin?

Я запускаю приложение angular на локальном виртуальном хосте (http://foo.app:8000). Он отправляет запрос другому локальному VirtualHost (http://bar.app:8000) с помощью $http.post.

$http.post('http://bar.app:8000/mobile/reply', reply, {withCredentials: true});

На вкладке "Сеть" в инструментах разработчика Chrome я, конечно, вижу запрос OPTIONS, а ответ включает заголовок:

Access-Control-Allow-Origin: http://foo.app:8000

Однако запрос POST отменяется со следующей ошибкой:

Нет заголовка "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе. Происхождение http://foo.app:8000 ', следовательно, не допускается.

Кто-нибудь испытал это? Заголовок Access-Control-Allow-Origin очень четко включен в ответ запроса OPTIONS, поэтому я не могу на всю жизнь понять, почему POST не работает, заголовок отсутствует.

Access-Control-Allow-Credentials также установлено на true.

4b9b3361

Ответ 1

Это ошибка в chrome для локального разработчика. Попробуйте другой браузер. Тогда это сработает.

Ответ 2

Обходной путь для тех, кто хочет использовать Chrome. Это расширение позволяет запрашивать любой сайт с AJAX из любого источника, так как он добавляет заголовок 'Access-Control-Allow-Origin: *' в ответ.

В качестве альтернативы вы можете добавить этот аргумент в свою программу запуска Chrome: --disable-web-security. Обратите внимание, что я использовал бы это только для целей разработки, а не для обычного "веб-серфинга". Для справки см. Run Chromium with Flags.

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

Ответ 3

Я отправлял запросы от angularjs, используя службу $http для bottle, работающую на http://localhost:8090/, и мне пришлось применить CORS, в противном случае я получил ошибки запроса, такие как заголовок "Нет" Access-Control-Allow-Origin "присутствует на запрошенном ресурсе"

from bottle import hook, route, run, request, abort, response

#https://github.com/defnull/bottle/blob/master/docs/recipes.rst#using-the-hooks-plugin

@hook('after_request')
def enable_cors():
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
    response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'

Ответ 4

У меня возникла такая же проблема. Для меня запрос OPTIONS будет проходить, но запрос POST будет "отменен". Это заставило меня поверить, что браузер никогда не делал запрос POST вообще. Хром сказал что-то вроде "Предостережения предварительные заголовки показаны" в заголовках запроса, но никаких заголовков ответа не было показано. В конце концов я обратился к отладке в Firefox, что заставило меня выяснить, что мой сервер ответил с ошибкой, и в ответе не было заголовков CORS. На самом деле Chrome получал ответ, но не позволял отображать ответ в сетевом представлении.

Ответ 5

CROS необходимо устранить со стороны сервера.

Создайте фильтры согласно требованию, чтобы разрешить доступ и добавлять фильтры в web.xml

Пример использования spring:

Класс фильтра:

@Component
public class SimpleFilter implements Filter {

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

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
                     FilterChain chain) throws IOException, ServletException {

    HttpServletResponse response=(HttpServletResponse) resp;

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

    chain.doFilter(req, resp);
}

@Override
public void destroy() {}

}

web.xml:

<filter>
    <filter-name>simpleCORSFilter</filter-name>
    <filter-class>
        com.abc.web.controller.general.SimpleFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>simpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Ответ 6

Сегодня я столкнулся с этой проблемой. Оказалось, что ошибка на сервере (исключение из нулевого указателя) приводит к сбою при создании ответа, но он все еще генерирует код состояния HTTP из 200. Из-за кода статуса 200 Chrome ожидает действительный ответ. Первое, что сделал Chrome, - это поиск заголовка "Access-Control-Allow-Origin", который он не нашел. Затем Chrome отменил запрос, а Angular дал мне ошибку. Ошибка при обработке запроса POST является причиной того, что ОПЦИИ будут успешными, но POST завершится с ошибкой.

Короче говоря, если вы видите эту ошибку, возможно, ваш сервер не возвратил никаких заголовков вообще в ответ на запрос POST.

Ответ 7

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

В запрошенном ресурсе присутствует заголовок No-Access-Control-Allow-Origin. Следовательно, исходный 'null' не имеет права доступа. В ответе был код статуса HTTP 401. "

когда я отправляю неправильное имя пользователя или пароль с запросом POST для входа.

Ответ 8

Вместо использования $http.get ('abc/xyz/getSomething') попробуйте использовать $http.jsonp ( 'абв/хуг/getSomething')

     return{
            getList:function(){
                return $http.jsonp('http://localhost:8080/getNames');
            }
        }

Ответ 9

Если у вас есть эта проблема в sails.js, просто установите для вашего cors.js авторизацию как разрешенный заголовок

/***************************************************************************
  *                                                                          *
  * Which headers should be allowed for CORS requests? This is only used in  *
  * response to preflight requests.                                          *
  *                                                                          *
  ***************************************************************************/

  headers: 'Authorization' // this line here