2015-10-16 19 views
17

Sto lavorando su un'applicazione web comprende UI-angolare, Server-Java, RESTEasy 3.0.9.Final per API REST chiamaNessuna intestazione è presente sulla risorsa richiesta - Resteasy

quando ho cercato di accedere al servizio resto da un altro dominio che ottiene sotto l'errore

non può caricare risposta alla richiesta di verifica preliminare non passa di controllo di controllo di accesso: intestazione No 'Access-Control-Allow-Origin' è presente sul risorsa richiesta L'origine 'http://localhost:8080' non è quindi consentita l'accesso.

Ho configurato il mio lato server per rispondere alle chiamate tra domini diversi e questo sta lavorando con il GET chiamata ma POST chiamata è la creazione di ERRORE

web.xml

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.test.sample.app.CorsFeature</param-value> 
</context-param> 

<listener> 
    <listener-class> 
     org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
</listener> 


<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <servlet-class> 
     org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.test.sample.app.Application</param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>resteasy.servlet.mapping.prefix</param-name> 
    <param-value>/rest</param-value> 
</context-param> 
<context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
</context-param> 

classe di servizio

@GET 
@Path("/getnameAtt") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getHostnameAttributes() { 
return Response 
.status(200) 
.header("Access-Control-Allow-Origin", "*") 
.header("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization") 
.header("Access-Control-Allow-Credentials", "true") 
.header("Access-Control-Allow-Methods", 
     "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
.header("Access-Control-Max-Age", "1209600") 
.entity(new TestImpl().getHostNameAttributes()) 
.build(); 
} 

@POST 
@Path("/getSeq") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getCurrentSequence(String request) { 
return Response 
.status(200) 
.header("Access-Control-Allow-Origin", "*") 
.header("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization") 
.header("Access-Control-Allow-Credentials", "true") 
.header("Access-Control-Allow-Methods", 
     "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
.header("Access-Control-Max-Age", "1209600") 
.entity(new TestImpl().getCurrentSeq(request)) 
.build(); 
} 

Da quando sono nuovo a restea non sono in grado di capire perché questo non funzionava. Qualsiasi aiuto sarebbe molto apprezzato. Attendo una tua risposta.

Grazie

risposta

8

metodi delle risorse non avranno colpito, in modo intestazioni non potrà mai ottenere set. Il motivo è che esiste una richiesta di preflight prima della richiesta effettiva, che è una richiesta OPTIONS. Quindi l'errore deriva dal fatto che la richiesta di verifica preliminare non produce le intestazioni necessarie.

Per RESTeasy, è necessario utilizzare CorsFilter. Puoi vedere here per qualche esempio su come configurarlo. Questo filtro gestirà la richiesta di preflight. Quindi puoi rimuovere tutte quelle intestazioni che hai nei tuoi metodi di risorsa.

Vedere anche:

+0

Grazie per la risposta. Ho usato quel CorsFilter e annotato con @Provider. ma quella classe non è nemmeno chiamata. Devo aggiungere qualcosa nel web.xml – user3595995

+0

L'esempio a cui mi sono collegato era per la ricerca di risorse. Se si registrano esplicitamente tutte le risorse e i provider, è sufficiente registrare il 'CorsFilter' nella classe' Application'. Oppure registra la 'Caratteristica'. In entrambi i casi funziona. La "caratteristica" non è necessaria però.Puoi semplicemente registrare 'CorsFilter' nella tua sovrascrittura di' getSingletons() 'nella tua classe' Application' –

+0

se la richiesta di preflight è esplicita o se è gestita internamente dal browser? Devo inviare una richiesta di preflight OPTION prima di inviare la richiesta effettiva? Sono bloccato a un errore simile. –

0

Sembra che il tuo metodo di risorsa POST non verrà colpito menzione come @peeskillet. Molto probabilmente la tua richiesta ~ POST ~ non funzionerà, perché potrebbe non essere una semplice richiesta. Le uniche richieste semplici sono GET, HEAD o POST e le intestazioni delle richieste sono semplici (le uniche intestazioni semplici sono Accept, Accept-Language, Content-Language, Content-Type = application/x-www-form-urlencoded, multipart/form-data , testo/pianura).

Poiché in è già possibile aggiungere intestazioni Access-Control-Allow-Origin alla risposta, è possibile aggiungere nuovo metodo OPTIONS alla classe di risorse.

@OPTIONS 
@Path("{path : .*}") 
public Response options() { 
    return Response.ok("") 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") 
      .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
      .header("Access-Control-Max-Age", "2000") 
      .build(); 
} 
Problemi correlati