IT-Swarm.Net

Το πεδίο κεφαλίδας αιτήματος Access-Control-Allow-Headers δεν επιτρέπεται από το Access-Control-Allow-Headers

Προσπαθώ να στείλω αρχεία στο διακομιστή μου με ένα αίτημα μετά, αλλά όταν το στέλνει προκαλεί το σφάλμα:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

Γι 'αυτό πήρα το λάθος και πρόσθεσα τις κεφαλίδες:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

Τότε έχω το λάθος:

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers

Γι 'αυτό πήγα και αυτό και το μόνο παρόμοιο ερώτημα που θα μπορούσα να βρω έδωσε μια μισή απάντηση έπειτα έκλεισε ως εκτός θέματος. Ποιες επικεφαλίδες πρέπει να προσθέσω/αφαιρέσω;

186
user3194367

Το server (που αποστέλλεται το αίτημα POST) πρέπει να περιλαμβάνει την κεφαλίδα Access-Control-Allow-Headers (κλπ) στην απάντησή του. Η τοποθέτησή τους στο αίτημά σας από τον πελάτη δεν έχει καμία επίδραση.

Αυτό οφείλεται στο γεγονός ότι εναπόκειται στον διακομιστή να καθορίσει ότι δέχεται αιτήσεις διασταυρούμενης προέλευσης (και ότι επιτρέπει την κεφαλίδα Content-Type αίτησης και ούτω καθεξής) - ο πελάτης δεν μπορεί να αποφασίσει για τον εαυτό του ότι ένας δεδομένος διακομιστής πρέπει να επιτρέπει την CORS.

161
Shai

Είχα το ίδιο πρόβλημα. Στην τεκμηρίωση του jQuery Βρήκα:

Για αιτήσεις μεταξύ διαφόρων τομέων, ο καθορισμός του τύπου περιεχομένου σε οτιδήποτε άλλο εκτός από application/x-www-form-urlencoded, multipart/form-data ή text/plain θα ενεργοποιήσει το πρόγραμμα περιήγησης ώστε να στείλει ένα αίτημα προθέματος OPTIONS στο διακομιστή.

Επομένως, παρόλο που ο διακομιστής επιτρέπει αίτημα σταυρού προέλευσης, αλλά δεν επιτρέπει Access-Control-Allow-Headers, θα ρίξει λάθη. Ο προεπιλεγμένος τύπος γωνιακού περιεχομένου είναι application/json, ο οποίος προσπαθεί να στείλει ένα αίτημα OPTION. Προσπαθήστε να αντικαταστήσετε την κεφαλίδα προκαθορισμένης γωνίας ή να επιτρέψετε το Access-Control-Allow-Headers στο τέλος του διακομιστή. Εδώ είναι ένα γωνιακό δείγμα:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});
198
Fisherman

Εάν αυτό βοηθά κανέναν, ακόμη και αυτό το είδος φτωχών, όπως πρέπει να επιτρέψουμε μόνο αυτό για dev σκοπό, εδώ είναι μια λύση Java, όπως αντιμετώπισα το ίδιο θέμα. [Επεξεργασία] Μην χρησιμοποιείτε την wild card * επειδή είναι μια κακή λύση, χρησιμοποιήστε το localhost εάν θέλετε πραγματικά να έχετε κάτι που λειτουργεί τοπικά.

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}
43
lekant

Ο διακομιστής (που αποστέλλεται το αίτημα POST) πρέπει να περιλαμβάνει την κεφαλίδα Content Type στην απάντησή του.

Ακολουθεί μια λίστα τυπικών κεφαλίδων που συμπεριλαμβάνεται, συμπεριλαμβανομένης μιας προσαρμοσμένης κεφαλίδας "X_ACCESS_TOKEN":

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

Αυτό πρέπει να ρυθμίσει ο τύπος του διακομιστή HTTP για τον διακομιστή ιστού στον οποίο στέλνετε τα αιτήματά σας.

Ίσως θελήσετε επίσης να ζητήσετε από τον τύπο του διακομιστή σας να εκθέσει την κεφαλίδα "Περιεχόμενο-Μήκος".

Θα αναγνωρίσει αυτό ως αίτημα κοινής κατανομής πόρων (CORS) και θα πρέπει να κατανοήσει τις συνέπειες της δημιουργίας αυτών των διαμορφώσεων διακομιστών.

Για λεπτομέρειες δείτε:

13
l3x

Τα παρακάτω έργα για μένα με τον κόμβο js:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});
8
Fernando Gabrieli

Μπορείτε να ενεργοποιήσετε την κατάλληλη κεφαλίδα στο PHP με αυτό:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");
6
Vinod Dhakad

Οι κεφαλίδες που προσπαθείτε να ορίσετε είναι απάντηση κεφαλίδες. Πρέπει να παρέχονται, στην απάντηση, από τον εξυπηρετητή στον οποίο υποβάλλετε το αίτημα.

Δεν έχουν θέση στον πελάτη. Θα ήταν άσκοπο να έχουμε ένα μέσο για να χορηγήσουμε άδειες αν θα μπορούσαν να χορηγηθούν από τον ιστότοπο ότι ήθελε άδεια αντί του ιστότοπου που κατείχε τα δεδομένα.

4
Quentin

εάν δοκιμάζετε μερικά javascript αιτήματα για ionic2 ή angularjs 2, στο Chrome σας στο pc ή mac, στη συνέχεια, βεβαιωθείτε ότι έχετε εγκαταστήσει το plugin CORS για Chrome browser για να επιτρέψει σταυρό Προέλευση.

μπορεί να πάρει τα αιτήματα θα λειτουργήσει χωρίς να χρειάζεται αυτό, αλλά μετά και βάζει και να διαγράψετε θα χρειαστεί να εγκαταστήσετε cors plugin για δοκιμές για να πάει χωρίς προβλήματα, ότι definitley δεν είναι δροσερό, αλλά δεν ξέρω πώς οι άνθρωποι το κάνουν χωρίς plugin CORS.

και επίσης να είστε σίγουροι ότι η απάντηση json δεν επιστρέφει 400 από κάποια κατάσταση json

3
albaiti

Αν κάποιος αντιμετωπίσει αυτό το πρόβλημα με έναν διακομιστή έκτακτης ανάγκης, προσθέστε το ακόλουθο μεσαίο λογισμικό

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
3
Abdel

αυτό είναι πρόβλημα backend. εάν η χρήση πλέει api στην αλλαγή backcors cors.js και προσθέστε το αρχείο σας εδώ

module.exports.cors = {
  allRoutes: true,
  Origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};
3
Sedat Y

Στην περίπτωσή μου, λαμβάνω πολλές παραμέτρους ως @HeaderParam σε μια μέθοδο υπηρεσίας ιστού.

Αυτές οι παράμετροι ΠΡΕΠΕΙ να δηλωθούν στο φίλτρο CORS με αυτόν τον τρόπο:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}
2
russellhoff

Το σφάλμα Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers σημαίνει ότι το πεδίο Access-Control-Allow-Origin της κεφαλίδας HTTP δεν χειρίζεται ή δεν επιτρέπεται από την απάντηση. Καταργήστε το πεδίο Access-Control-Allow-Origin από την κεφαλίδα αιτήματος.

2
Tony Stark