web-dev-qa-db-fra.com

Aucun en-tête Access-Control-Allow-Origin n'est présent sur la ressource demandée

Je souhaite accéder aux informations du même domaine mais avec un numéro de port différent. Pour cela, j'ajoute Access-Control-Allow-Origin avec l'en-tête de réponse.

Code Servlet: (présent sur www.example.com:PORT_NUMBER)

String json = new Gson().toJson(list);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");//cross domain request/CORS
response.getWriter().write(json);

code jQuery: (présent sur www.example.com)

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'}).done(function(data)
{
    alert(data);
});

Plusieurs fois, j'obtiens cette erreur (dans la console):

XMLHttpRequest cannot load 'http://www.example.com:PORT_NUMBER/MYSERVLET'
No 'Access-Control-Allow-Origin' header is present on the requested resource.

Cette erreur se produit principalement la première fois lorsque $.post s'exécute. La deuxième fois, cela permet.

Ma question est qu'il manque dans le code servlet ou jQuery?

N'hésitez pas à nous faire part de vos suggestions.

pdate1

J'ai changé:

response.setHeader("Access-Control-Allow-Origin", "*");

À:

response.setHeader("Access-Control-Allow-Origin", "http://www.example.com");

Ensuite, je reçois cette erreur dans la console:

XMLHttpRequest cannot load http://www.example.com:PORT_NUMBER/MyServletName
The 'Access-Control-Allow-Origin' whitelists only 'http://www.example.com'
Origin 'http://www.example.com' is not in the list,
and is therefore not allowed access.

[Remarque: la liste blanche et l'origine sont identiques, mais cela donne toujours une erreur. Cela fonctionne parfois et donne parfois des erreurs ci-dessus.]

Faites-moi savoir si vous avez besoin de plus d'informations.

19
Bhushan

Solution :
Au lieu d'utiliser la méthode setHeader, j'ai utilisé addHeader.

response.addHeader("Access-Control-Allow-Origin", "*");

* dans la ligne ci-dessus permettra l'accès à tous les domaines. Pour autoriser l'accès à un domaine spécifique uniquement:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

Pour les problèmes liés à IE <= 9, veuillez consulter ici .

33
Bhushan

DataType 'json' vous manque dans la méthode $.post():

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'})
        .done(function(data){
                  alert(data);
         }, "json");
         //-^^^^^^-------here

Mises à jour:

essayez avec ceci:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

2
Jai

Je trouve la solution dans spring.io , comme ceci:

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
1
Richard Xue

Sur votre servlet, remplacez simplement la méthode de service de votre servlet pour pouvoir ajouter des en-têtes pour toutes vos méthodes http (POST, GET, DELETE, PUT, etc ...).

@Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        if(("http://www.example.com").equals(req.getHeader("Origin"))){
            res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
            res.setHeader("Access-Control-Allow-Headers", "Authorization");
        }

        super.service(req, res);
    }
0