2017-08-31 2 views
0

J'ai un problème avec l'en-tête « Access-contrôle permet origine », j'utiliser le code suivant pour faire une demande:Access-contrôle permet origine ne fonctionne pas avec ajax dans une requête POST

<script type='text/javascript'> 
function save() { 
      $.ajax(
     { 
     type: 'POST', 
     url: "...",     
     contentType: 'application/json', 
     data: '{"cuspp":"228061JGLIR5", "userWeb":"46689"}', 
     success: function (data) { 
       console.log("It Works"); 
       console.log (data); 
       if (data.codigo==0){ 
        console.log(data.mensaje); 
       }else{ 
        console.log(data.mensaje); 

       } 
      }, 
     error: function (jqXHR, textStatus, errorThrown) { 
        console.log("error"); 
      } 
     }); 
} 
</script> 

Et la réponse elle est faite par un client java:

@POST 
@Path("/pcnct020") 
@ApiOperation(value = "Save events.", notes = "PCNCT020", responseClass = 
"data.Answer") 
public Response saveEvents(
    @ApiParam(value="Structure of Event", required = false) Evento event) {  


    Answer<Result> answer = Validator.validate(event); 

    if (answer.esOK()) { 

     int size = event.textDetail.length(); 

     int count = size/60; 

     String comment = event.textDetail; 
     int secuence = 0; 

     for (int j = 0; j <= count; j++) { 
      evento.secuence = secuence; 
      String newString; 

      if (j == 0) {           
       if (size < 60) {          
        newString = comment.substring(j * 60); 

       } else {            
        newString = comment.substring(j * 60, 
          (j * 60) + 60); 
       } 

      } else if (j == count) {        
       newString = comment.substring(j * 60);   
       if (newString.equals("")) {      
        break; 
       } 

      } else { 
       newString = comment.substring(j * 60, 
         (j * 60) + 60); 
       if (newString.equals("")) { 
        break; 
       } 
      } 
      event.textDetail = newString; 
      answer.setAnswer(event.saveEvent()); 
      secuence = Integer.parseInt(answer.ans.status); 
     } 

    } 
    return Response 
      .status(200) 
      .header("Access-Control-Allow-Origin", "...") 
      //.header("Access-Control-Allow-Credentials", "true") 
      //.header("Access-Control-Allow-Headers", "Origin") 
      //.header("Access-Control-Allow-Methods", "GET, POST, DELETE, 
       PUT, PATCH, HEAD, OPTIONS") 
      //.header("Conten-Type","application/application/json") 
      .entity(answer) 
      .build(); 

} 

Lorsque vous essayez d'accéder à l'adresse indiquée l'en-tête "Access-Control-Allow-Origin", dans la console du navigateur je reçois cette erreur:

XMLHttpRequest ne peut pas annonce http://sdpeapp00024.pe.intranet:9080/ccws/rest/ops/pcnct020. La réponse à la demande de contrôle en amont ne passe pas la vérification du contrôle d'accès: aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée. L'origine 'http://i6.sura.pe' n'est donc pas autorisée.

Je ne sais pas ce que je pourrais faire d'autre. J'ai essayé d'ajouter d'autres en-têtes, comme les commentaires dans la réponse du code java et j'ai toujours la même erreur.

J'apprécierais grandement votre aide.

MISE À JOUR:

public void getService(){ 

     try { 

     String urlWS = "Web Service Url"; 

     String url = urlWS; 

     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     HttpPost httpPost = new HttpPost(url); 

     httpPost.setHeader("Content-type", "application/json"); 

     StringEntity params =new StringEntity(" 
     {\"cuspp\":\"228061JGLIR0\", \"usuarioWeb\":\"46683\");           


     httpPost.setEntity(params); 


     CloseableHttpResponse response = 
     httpclient.execute(httpPost); 

     System.out.println(response.getStatusLine());    

     System.out.println(response.getStatusLine().getStatusCode()); 

     if(response.getStatusLine().getStatusCode() == 200){ 
      BufferedReader brResponse = new BufferedReader(new 
      InputStreamReader(response.getEntity().getContent())); 
      String responseText = ""; 
      String output = ""; 
      while ((output = brResponse.readLine()) != null) { 
         responseText += output; 
      } 
      System.out.println(responseText); 


     }    

    } catch (Exception excepcion) {    
      System.out.println(excepcion.toString()); 
    } 
    finally{ 

    } 
} 

J'ai fait un client avec Java et fonctionne très bien. Je ne sais pas vraiment pourquoi utiliser Ajax ne fonctionne pas, mais cela montre que le service web fonctionne correctement et que le problème est dans le client.

Salutations.

PS. Dans le code je ne mets pas les urls parce que je ne suis pas autorisé à publier avec plus de deux URL, mais ce sont les mêmes qui sont affichés dans le message d'erreur.

+1

Il semble que vous devez activer CORS pour le point final Cochez cette https://spring.io/guides/gs/rest-service-cors/ –

+0

Merci, mais je ne suis pas à l'aide Cadre de printemps. – DeadByte0x4

Répondre

0

Cette link devrait vous donner une idée de base de CORS.

En bref une erreur se produit lorsque CORS votre client sur le domaine www.example1.com * tente de frapper un api qui est hébergé sur www.example2.com. L'erreur CORS que vous obtenez est un indicateur de sécurité par le navigateur.

Vous pouvez donc le résoudre de deux façons.

  1. Sur votre serveur principal www.example2.com. Activer les en-têtes CORS pour toutes les demandes entrantes (Autoriser les demandes avec des en-têtes d'autres origines). et dans votre requête AJAX, définissez les en-têtes CORS. Par conséquent, la demande va du Client -> www.example2.com/post_url

  2. Je préfère cette méthode. A partir de votre client qui est sur www.example1.com atteint un itinéraire interne www.example1.com/api/post_url et transmettre toutes les demandes de /api à www.example2.com via nginx ou configuration du serveur apache. Par conséquent la demande passe de client -> www.example1.com/api/post_url -> www.example2.com/post_url

+0

Merci pour la réponse. J'ai essayé la première solution mais je n'ai pas réussi. D'après ce que j'ai lu, cette erreur est générique et n'indique pas nécessairement le vrai problème. En ce qui concerne la deuxième solution, je ne peux pas utiliser un autre serveur, le projet est implémenté dans Websphere Server. – DeadByte0x4

0

Mettre en œuvre ContainerResponseFilter dans votre service.Cela devrait résoudre votre problème,

public class Filter implements ContainerResponseFilter { 

    @Override 
    public ContainerResponse filter(ContainerRequest request, 
      ContainerResponse response) { 

     response.getHttpHeaders().add("Access-Control-Allow-Origin", "*"); 
     response.getHttpHeaders().add("Access-Control-Allow-Headers", 
       "origin, content-type, accept, authorization, X-Request-With"); 
     response.getHttpHeaders().add("Access-Control-Allow-Credentials", 
       "true"); 
     response.getHttpHeaders().add("Access-Control-Allow-Methods", 
       "GET, POST, PUT, DELETE, HEAD"); 

     return response; 
    } 
} 
+0

Merci pour la réponse, mais cela n'a pas fonctionné. – DeadByte0x4