<p>προσπαθώ να στείλω αρχεία στο διακομιστή μου με ένα αίτημα μετά, αλλά όταν το στέλνει προκαλεί το σφάλμα:</p><pre class="lang-none prettyprint-override"><code>request header field content-type is not allowed by access-control-allow-headers. </code></pre><p>γι 'αυτό πήρα το λάθος και πρόσθεσα τις κεφαλίδες:</p><pre><code>$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" } </code></pre><p>τότε έχω το λάθος:</p><pre class="lang-none prettyprint-override"><code>request header field access-control-allow-origin is not allowed by access-control-allow-headers </code></pre><p>γι 'αυτό πήγα και αυτό και το μόνο παρόμοιο ερώτημα που θα μπορούσα να βρω έδωσε μια μισή απάντηση έπειτα έκλεισε ως εκτός θέματος. ποιες επικεφαλίδες πρέπει να προσθέσω/αφαιρέσω;</p>
το πεδίο κεφαλίδας αιτήματος access-control-allow-headers δεν επιτρέπεται από το access-control-allow-headers
<p>το <strong>server</strong> (που αποστέλλεται το αίτημα post) πρέπει να περιλαμβάνει την κεφαλίδα <code>access-control-allow-headers</code> (κλπ) <strong>στην απάντησή του</strong>. η τοποθέτησή τους στο αίτημά σας από τον πελάτη δεν έχει καμία επίδραση.</p><p>αυτό οφείλεται στο γεγονός ότι εναπόκειται στον διακομιστή να καθορίσει ότι δέχεται αιτήσεις διασταυρούμενης προέλευσης (και ότι επιτρέπει την κεφαλίδα <code>content-type</code> αίτησης και ούτω καθεξής) - ο πελάτης δεν μπορεί να αποφασίσει για τον εαυτό του ότι ένας δεδομένος διακομιστής πρέπει να επιτρέπει την cors.</p>
<p>είχα το ίδιο πρόβλημα. <a href="http://api.jquery.com/jquery.ajax/">στην τεκμηρίωση του jquery</a> βρήκα:</p><blockquote> <p>για αιτήσεις μεταξύ διαφόρων τομέων, ο καθορισμός του τύπου περιεχομένου σε οτιδήποτε άλλο εκτός από <code>application/x-www-form-urlencoded</code>, <code>multipart/form-data</code> ή <code>text/plain</code> θα ενεργοποιήσει το πρόγραμμα περιήγησης ώστε να στείλει ένα αίτημα προθέματος options στο διακομιστή.</p> </blockquote><p>επομένως, παρόλο που ο διακομιστής επιτρέπει αίτημα σταυρού προέλευσης, αλλά δεν επιτρέπει <code>access-control-allow-headers</code>, θα ρίξει λάθη. ο προεπιλεγμένος τύπος γωνιακού περιεχομένου είναι <code>application/json</code>, ο οποίος προσπαθεί να στείλει ένα αίτημα option. προσπαθήστε να αντικαταστήσετε την κεφαλίδα προκαθορισμένης γωνίας ή να επιτρέψετε το <code>access-control-allow-headers</code> στο τέλος του διακομιστή. εδώ είναι ένα γωνιακό δείγμα:</p><pre><code>$http.post(url, data, { headers : { 'content-type' : 'application/x-www-form-urlencoded; charset=utf-8' } }); </code></pre>
<p>εάν αυτό βοηθά κανέναν, ακόμη και αυτό το είδος φτωχών, όπως πρέπει να επιτρέψουμε μόνο αυτό για dev σκοπό, εδώ είναι μια λύση java, όπως αντιμετώπισα το ίδιο θέμα. [επεξεργασία] μην χρησιμοποιείτε την wild card * επειδή είναι μια κακή λύση, χρησιμοποιήστε το localhost εάν θέλετε πραγματικά να έχετε κάτι που λειτουργεί τοπικά.</p><pre><code>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() {} } </code></pre>
<p>ο διακομιστής (που αποστέλλεται το αίτημα post) πρέπει να περιλαμβάνει την κεφαλίδα <strong> content type </strong> στην απάντησή του.</p><p>ακολουθεί μια λίστα τυπικών κεφαλίδων που συμπεριλαμβάνεται, συμπεριλαμβανομένης μιας προσαρμοσμένης κεφαλίδας "x\_access\_token":</p><pre><code>"x-access\_token", "access-control-allow-origin", "authorization", "origin", "x-requested-with", "content-type", "content-range", "content-disposition", "content-description" </code></pre><p>αυτό πρέπει να ρυθμίσει ο τύπος του διακομιστή http για τον διακομιστή ιστού στον οποίο στέλνετε τα αιτήματά σας.</p><p>ίσως θελήσετε επίσης να ζητήσετε από τον τύπο του διακομιστή σας να εκθέσει την κεφαλίδα "περιεχόμενο-μήκος".</p><p>θα αναγνωρίσει αυτό ως αίτημα κοινής κατανομής πόρων (cors) και θα πρέπει να κατανοήσει τις συνέπειες της δημιουργίας αυτών των διαμορφώσεων διακομιστών.</p><p>για λεπτομέρειες δείτε:</p><ul> <li> <a href="http://www.w3.org/tr/cors/">http://www.w3.org/tr/cors/</a> </li> <li> <a href="http://enable-cors.org/">http://enable-cors.org/</a> </li> </ul>
<p>τα παρακάτω έργα για μένα με τον κόμβο js:</p><pre><code>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(); }); </code></pre>
<p>μπορείτε να ενεργοποιήσετε την κατάλληλη κεφαλίδα στο php με αυτό:</p><pre><code>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"); </code></pre>
<p>οι κεφαλίδες που προσπαθείτε να ορίσετε είναι <strong>απάντηση</strong> κεφαλίδες. πρέπει να παρέχονται, στην απάντηση, από τον εξυπηρετητή στον οποίο υποβάλλετε το αίτημα.</p><p>δεν έχουν θέση στον πελάτη. θα ήταν άσκοπο να έχουμε ένα μέσο για να χορηγήσουμε άδειες αν θα μπορούσαν να χορηγηθούν από τον ιστότοπο ότι <em> ήθελε </em> άδεια αντί του ιστότοπου που κατείχε τα δεδομένα.</p>
<p>εάν δοκιμάζετε μερικά javascript αιτήματα για ionic2 ή angularjs 2, στο chrome σας στο pc ή mac, στη συνέχεια, βεβαιωθείτε ότι έχετε εγκαταστήσει το plugin cors για chrome browser για να επιτρέψει σταυρό προέλευση.</p><p>μπορεί να πάρει τα αιτήματα θα λειτουργήσει χωρίς να χρειάζεται αυτό, αλλά μετά και βάζει και να διαγράψετε θα χρειαστεί να εγκαταστήσετε cors plugin για δοκιμές για να πάει χωρίς προβλήματα, ότι definitley δεν είναι δροσερό, αλλά δεν ξέρω πώς οι άνθρωποι το κάνουν χωρίς plugin cors.</p><p>και επίσης να είστε σίγουροι ότι η απάντηση json δεν επιστρέφει 400 από κάποια κατάσταση json</p>
<p>αν κάποιος αντιμετωπίσει αυτό το πρόβλημα με έναν διακομιστή έκτακτης ανάγκης, προσθέστε το ακόλουθο μεσαίο λογισμικό</p><pre><code>app.use(function(req, res, next) { res.header("access-control-allow-headers", "origin, x-requested-with, content-type, accept"); next(); }); </code></pre>
<p>αυτό είναι πρόβλημα backend. εάν η χρήση πλέει api στην αλλαγή backcors cors.js και προσθέστε το αρχείο σας εδώ</p><pre><code>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' }; </code></pre>
<p>στην περίπτωσή μου, λαμβάνω πολλές παραμέτρους ως @headerparam σε μια μέθοδο υπηρεσίας ιστού.</p><p>αυτές οι παράμετροι πρεπει να δηλωθούν στο φίλτρο cors με αυτόν τον τρόπο:</p><pre><code>@provider public class corsfilter implements containerresponsefilter { @override public void filter(containerrequestcontext requestcontext, containerresponsecontext responsecontext) throws ioexception { multivaluedmap&lt;string, object&gt; 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"); } } </code></pre>
<p>το σφάλμα <code>request header field access-control-allow-origin is not allowed by access-control-allow-headers</code> σημαίνει ότι το πεδίο <code>access-control-allow-origin</code> της κεφαλίδας http δεν χειρίζεται ή δεν επιτρέπεται από την απάντηση. καταργήστε το πεδίο <code>access-control-allow-origin</code> από την κεφαλίδα αιτήματος.</p>