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

В запрошенном ресурсе нет заголовка Access-Control-Allow-Origin

Я хочу получить доступ к информации из того же домена, но с другим номером порта. Для этого я добавляю Access-Control-Allow-Origin с заголовком ответа.

Код сервлета: (присутствует на www.example.com:PORT_NUMBER)

String json = new Gson().toJson(list);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");//cross domain request/CORS
response.getWriter().write(json);

Код jQuery: (присутствует на www.example.com)

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'}).done(function(data)
{
    alert(data);
});

Несколько раз я получаю эту ошибку (в консоли):

XMLHttpRequest cannot load 'http://www.example.com:PORT_NUMBER/MYSERVLET'
No 'Access-Control-Allow-Origin' header is present on the requested resource.

Эта ошибка чаще всего возникает при первом запуске $.post. Второй раз это позволяет.

Мой вопрос в том, что там отсутствует код servlet или jQuery?

Любое предложение будет оценено.

Update1

Я изменил:

response.setHeader("Access-Control-Allow-Origin", "*");

To:

response.setHeader("Access-Control-Allow-Origin", "http://www.example.com");

Затем я получаю эту ошибку в консоли:

XMLHttpRequest cannot load http://www.example.com:PORT_NUMBER/MyServletName
The 'Access-Control-Allow-Origin' whitelists only 'http://www.example.com'
Origin 'http://www.example.com' is not in the list,
and is therefore not allowed access.

[Примечание: белый список и источник совпадают, но все же он дает ошибку. Он работает иногда и иногда вызывает ошибку.]

Сообщите мне, если вам нужна дополнительная информация.

4b9b3361

Ответ 1

Решение:
Вместо использования метода setHeader я использовал addHeader.

response.addHeader("Access-Control-Allow-Origin", "*");

* в приведенной выше строке разрешает доступ ко всем доменам, для разрешения доступа только к определенному домену:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

По вопросам, связанным с IE <= 9, см. здесь.

Ответ 2

В методе $.post() отсутствует 'dataType' json ':

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'})
        .done(function(data){
                  alert(data);
         }, "json");
         //-^^^^^^-------here

Обновление:

попробуйте следующее:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

Ответ 3

Я нахожу решение в spring.io, например:

    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");

Ответ 4

На вашем сервлете просто переопределите метод службы вашего сервлета, чтобы вы могли добавлять заголовки для всех ваших методов http (POST, GET, DELETE, PUT и т.д.).

@Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        if(("http://www.example.com").equals(req.getHeader("origin"))){
            res.setHeader("Access-Control-Allow-Origin", req.getHeader("origin"));
            res.setHeader("Access-Control-Allow-Headers", "Authorization");
        }

        super.service(req, res);
    }