AngularJS: запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса
вот мой код:
angular.module('option')
.factory('optionListService', ['$resource', function($resource) {
return $resource(HOST+'option/action/:id', {}, {
'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
});
}]);
и эта работа для запросов GET, а не для POST!
Я использую Apache как сервер и настроил его с помощью:
<Limit GET HEAD POST PUT DELETE OPTIONS>
Order Allow,Deny
Allow from all
</Limit>
Header set Access-Control-Allow-Origin "*"
и в моих angularjs я включаю в конфигурацию приложения модуля:
delete $httpProvider.defaults.headers.common['X-Requested-With'];
delete $httpProvider.defaults.headers.post['Content-type'];
но запрос POST все еще не работает!
Я надеюсь, что кто-то может дать какую-либо идею.
Ответы
Ответ 1
Добавьте эти заголовки со стороны сервера:
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Access-Control-Allow-Methods: GET, POST
Если все еще не работает, отправьте информацию о запросе предпросмотра OPTIONS
, который отправляет браузер.
Зачем это требуется?
Если это не простой запрос (например, GET или POST данных формы), браузер отправляет серверу запрос preflight HTTP OPTIONS
, чтобы проверить, разрешен ли CORS. Этот запрос содержит несколько заголовков Access-Control-Request
(может отличаться в зависимости от конкретного запроса):
Access-Control-Request-Headers: accept, content-type
Access-Control-Request-Method: POST
Теперь важно, чтобы сервер ссылался на тот же заголовок Access-Control-Allow
в ответе:
Access-Control-Allow-Headers: accept, content-type
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: *
В противном случае запрос отклоняется браузером.
@ilyas: окончательно после 3 часов исследования Я рассмотрел эту проблему
//Part added by ilyas :
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
//End of part.
Я надеюсь, что это поможет другим.
Ответ 2
Добавьте заголовок в свой файл, который вы нажимаете на вызов ajax следующим образом
<? php header('Access-Control-Allow-Origin: *'); ?>
Ответ 3
Я нашел отличный пример и объяснение здесь http://www.codingpedia.org/ama/how-to-add-cors-support-on-the-server-side-in-java-with-jersey/
@GET
@Path("{id}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getPodcastById(@PathParam("id") Long id, @QueryParam("detailed") boolean detailed)
throws IOException, AppException {
Podcast podcastById = podcastService.getPodcastById(id);
return Response.ok() //200
.entity(podcastById, detailed ? new Annotation[] {PodcastDetailedView.Factory.get()} : new Annotation[0])
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
.allow("OPTIONS").build();
}
Ответ 4
Вот проблема на стороне сервера. Если ваше приложение использует фреймворк spring. Вы можете исправить это, используя метод фильтра
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.setHeader("Access-Control-Max-Age", "3600");
res.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
res.addHeader("Access-Control-Expose-Headers", "xsrf-token");
if ("OPTIONS".equals(req.getMethod())) {
res.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
Кстати, вы можете копать глубже через post angularjs spring заблокирован запрос перекрестного происхождения