2013-08-14 8 views
15

Ho un webservice RESTful che restituirà la stringa ed è stato scritto in Java (JAX-WS). Il mio problema è quando invio richiesta in tal webservice con URL del tipo:RESTful webservice: come impostare le intestazioni in java per accettare XMLHttpRequest consentito da Access-Control-Allow-Origin

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

Nella console mi sta dando il seguente messaggio di errore:

XMLHttpRequest non è possibile caricare Origine URL localhost non è consentito di Access-Control-Allow-Origin

Come posso gestire questo problema? Codice

Java:

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

risposta

29

Leggi qui il tuo problema CORS: http://enable-cors.org/

Controllare se questo vi aiuterà nel vostro getMsg() metodo:
return Response.ok(output).header("Access-Control-Allow-Origin", "*").build();

Se sopra non lavoro prova ad aggiungere il filtro Jersey al tuo servizio. Crea classe di filtro:

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

e registra più avanti vincere web.xml con:

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


Un'altra soluzione è quella di utilizzare questo codice all'interno della vostra risorsa per fornire OPTIONS per il browser. Metti questo nella classe in cui hai @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(); 
    } 


Se non di questo lavoro, provare a sostituire il "*" previsto intestazione "Access-Control-Allow-Origin" con il tuo dominio personalizzato in cui si accedere a questa risorsa. I.G. Se si chiama questo da http://localhost::8080 utilizzare qualcosa come questo ("Access-Control-Allow-Origin", "http://localhost:8080") anziché asterisco "*".

+0

questa modifica funzionante su IE, non funzionante su chrome ancora lo stesso numero – ChiranjeeviIT

+0

aggiornato. prova la soluzione numero due. – flyer

+0

dopo una lunga ricerca, la tua soluzione sembra essere migliore e buona, grazie per la tua risposta, tienimi aggiornato se trovi una soluzione permanente. – ChiranjeeviIT