2013-08-14 19 views
15

Tôi có một webservice RESTful sẽ trả về chuỗi và nó được viết bằng Java (JAX-WS). Vấn đề của tôi là khi tôi gửi yêu cầu tới webservice rằng với URL như:RESTful webservice: cách đặt tiêu đề trong java để chấp nhận XMLHttpRequest được cho phép bởi Access-Control-Allow-Origin

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

Trong giao diện điều khiển nó đem lại cho tôi được thông báo lỗi dưới đây:

XMLHttpRequest không thể tải url xứ localhost không được phép bởi Access-Control-Allow-Origin

Làm cách nào để xử lý sự cố này? đang

Java:

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

Trả lời

29

đọc ở đây về CORS vấn đề của bạn: http://enable-cors.org/

Kiểm tra nếu điều này là một sự giúp đỡ bạn trong getMsg của bạn() phương pháp:
return Response.ok(output).header("Access-Control-Allow-Origin", "*").build();

Nếu ở trên không công việc cố gắng thêm bộ lọc Jersey vào dịch vụ của bạn. Tạo lớp lọc:

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; 
    } 
} 

và đăng ký sau đó giành chiến thắng web.xml với:

<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> 


Một giải pháp khác là sử dụng mã này trong tài nguyên của bạn để cung cấp OPTIONS cho trình duyệt. Đặt cái này vào lớp mà bạn có @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(); 
    } 


Nếu không làm việc này, hãy cố gắng trao đổi "*" quy định tiêu đề "-Control-Allow-Origin truy cập" với tên miền tùy chỉnh của bạn, nơi bạn truy cập khu vực này. Ví dụ: Nếu bạn gọi điện thoại này từ số http://localhost::8080 hãy sử dụng một cái gì đó như thế này ("Access-Control-Allow-Origin", "http://localhost:8080") thay vì dấu hoa thị "*".

+0

thay đổi này hoạt động trên IE, không hoạt động trên chrome vẫn cùng vấn đề – ChiranjeeviIT

+0

được cập nhật. thử đăng giải pháp số hai. – flyer

+0

sau khi nghiên cứu dài, giải pháp của bạn có vẻ tốt hơn và tốt, cảm ơn bạn đã trả lời, hãy cập nhật cho tôi nếu bạn tìm thấy bất kỳ giải pháp vĩnh viễn nào. – ChiranjeeviIT

Các vấn đề liên quan