«Access-Control-Allow-Origin: *» не влияет на веб-службу REST - PullRequest
6 голосов
/ 23 марта 2011

Я выполняю AJAX-вызов с клиента JavaScript (работает на компьютере A) на веб-сервер (работает на компьютере B).Клиент пытается получить доступ к URL-адресу, предоставленному веб-службой RESTful (Джерси), и он блокируется с ошибкой:

Источник http://localhost/ не разрешен Access-Control-Allow-Origin

На сервере я добавил 2 параметра заголовка, которые разрешают доступ любому клиенту.Однако это не помогло:

@Context
private HttpServletResponse servlerResponse;

@POST
@Path("testme")
public void test(){
    servlerResponse.addHeader("Access-Control-Allow-Origin", "*");
    servlerResponse.addHeader("Access-Control-Allow-Credentials", "true");
}

Те же заголовки работают в случае JSP:

<%
    response.addHeader("Access-Control-Allow-Origin", "*");
    response.addHeader("Access-Control-Allow-Credentials", "true");
%>
<html>
<head><title>test jsp</title></head>
<body>
test
</body>
</html>

Я что-то упустил?

спасибо

PS клиентская часть:

$.ajax({
    type: "POST",
    url: "http://localhost:8080/login/testme",
    dataType: 'json',
    success: onLoginSuccess,
    error: onLoginError
});

Ответы [ 2 ]

6 голосов
/ 15 декабря 2011

В качестве решения мы реализовали javax.servlet.Filter, который добавляет необходимые заголовки к каждому ответу:

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, java.io.IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    // This should be added in response to both the preflight and the actual request
    response.addHeader("Access-Control-Allow-Origin", "*");

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
        response.addHeader("Access-Control-Allow-Credentials", "true");
    }

    chain.doFilter(req, resp);
}
3 голосов
/ 17 октября 2013

@ epeleg. Я предпочитаю выполнять такие действия, как фильтрация ответов (Джерси 2.x):

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext,
            ContainerResponseContext responseContext) throws IOException {

        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
    }
}
...