RESTful webservice: как установить заголовки в java для принятия XMLHttpRequest, разрешенных Access-Control-Allow-Origin

У меня есть веб-сервис RESTful, который вернет строку и будет написан на Java (JAX-WS). Моя проблема заключается в отправке запроса на этот веб-сервис с URL-адресом, например:

http://localhost:8080/project/webservices/getlist/getListCustomers

В консоли он дает мне сообщение об ошибке ниже:

XMLHttpRequest не может загрузить URL-адрес Происхождение localhost не разрешено     через Access-Control-Allow-Origin

Как я могу справиться с этой проблемой?

Код Java:

@GET
@Path("/getsample")
public Response getMsg() { 
    String output = "Jersey say : " ;   
    return Response.status(200).entity(output).build();
}

Ответы

Ответ 1

Читайте здесь о своей проблеме CORS: http://enable-cors.org/

Проверьте, помогает ли эта помощь вам в методе getMsg():
return Response.ok(output).header("Access-Control-Allow-Origin", "*").build();

Если выше не работает, попробуйте добавить фильтр Джерси к вашей службе. Создать класс фильтра:

package your.package;

public class CORSFilter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {

        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");

        return cresp;
    }
}

И зарегистрируйте позже win web.xml с помощью:

<servlet>
<servlet-name>CORS Filter</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
 <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>your.package.CORSFilter</param-value>
 </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>CORS Filter</servlet-name>
    <url-pattern>/webservices/*</url-pattern>
</servlet-mapping>


Другим решением является использование этого кода внутри вашего ресурса для предоставления OPTIONS для браузера. Поместите это в класс, где у вас есть @GET.
  @OPTIONS
  @Path("/getsample")
  public Response getOptions() {
    return Response.ok()
      .header("Access-Control-Allow-Origin", "*")
      .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS")
      .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With").build();
  }


Если это не работает, попробуйте обменять "*" на заголовок "Access-Control-Allow-Origin" с вашим пользовательским доменом, где вы обращаетесь к этому ресурсу. I.g. Если вы вызываете это из http://localhost::8080, используйте что-то вроде этого ("Access-Control-Allow-Origin", "http://localhost:8080") вместо звездочки "*".