Socket.io - Origine non autorisés par Access-Control-Allow-Origin
Je sais qu'il y a eu un débat sur ce sujet, mais je ne peux pas trouver la réponse à ma question. J'ai une page web s'exécutant sur le serveur avec Aptana sur localhost:8020. Le javascript sur la page de frapper un nœud de serveur que j'ai en cours d'exécution sur localhost:1337. Là est le nœud code:
var io = require('socket.io');
var http = require('http');
var sys = require('sys');
var json = [];
var server = http.createServer(function (req, res) {
var headers = {};
headers["Access-Control-Allow-Origin"] = "*";
headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
headers["Access-Control-Allow-Credentials"] = true;
headers["Access-Control-Max-Age"] = '86400'; //24 hours
headers["Access-Control-Allow-Headers"] = "X-Requested-With, Access-Control-Allow-Origin, X-HTTP-Method-Override, Content-Type, Authorization, Accept";
res.writeHead(200, headers);
res.end();
});
server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
var socket = io.listen(server);
socket.on('connection', function(){
console.log("Connected");
});
Je suis la manipulation de la scro demande en changeant les en-têtes, qui je le fais tout le temps. De mon côté client, le code est généralement prise.io débutant choses. Voici le tag de mon code:
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
<script>
//Create SocketIO instance
var socket = new io.Socket('localhost',{
port: 1337
});
socket.connect();
//Add a connect listener
socket.on('connect',function() {
log('<span style="color:green;">Client has connected to the server!</span>');
});
//Add a connect listener
socket.on('message',function(data) {
log('Received a message from the server: ' + data);
});
//Add a disconnect listener
socket.on('disconnect',function() {
log('<span style="color:red;">The client has disconnected!</span>');
});
//Sends a message to the server via sockets
function sendMessageToServer(message) {
socket.send(message);
log('<span style="color:#888">Sending "' + message + '" to the server!</span>');
}
//Outputs to console and list
function log(message) {
var li = document.createElement('li');
li.innerHTML = message;
document.getElementById('message-list').appendChild(li);
}
Lorsque j'exécute le code, je reçois des 'XMLHTTPRequest...Origine n'est pas autorisée par Access-Control-Allow-Origin' erreurs. Mon navigateur est google chrome.
1. Pourquoi mon navigateur à l'aide de XMLHTTPRequest et pas un Websocket?
2. Pourquoi je reçois un contrôle d'Accès d'erreur lorsque je change les en-têtes?
Merci à tous pour l'aide à l'avance.
J'ai fait cela et j'ai besoin de poster une réponse complète, mais il a été un moment et j'ai besoin de regarder plus de ce que j'ai fait. Me donner un peu plus de détails sur ce que votre problème spécifique.
Je suis également en cours d'exécution dans ce problème, et serait intéressé à entendre votre solution. La seule solution que j'ai proposé n'est pas l'idéal, car il implique de piratage "manager.js" code de la douille.io bibliothèque de changer la ligne où il déclare en-têtes['Access-Control-Allow-Origin'] = '*'; Il y a une meilleure façon...
OriginalL'auteur jhamm | 2013-02-05
Vous devez vous connecter pour publier un commentaire.
Selon socket.io documentation, vous devriez être en mesure de définir à la fois la priorité des transports (et peut-être sauter une si elle crée des problèmes) et configurez-le de la prise.io origines directement.
OriginalL'auteur jornare
Vos en-têtes personnalisés en fait jamais écrites pour le socket.io demandes connexes.
Socket.IO remplace certaines méthodes du serveur http. L'un d'eux est le déclenchement de la "demande" des gestionnaires. Socket.IO permet uniquement de lui-même à être le principal gestionnaire de toutes les demandes. Ensuite, il teste si la demande est en fait une prise de courant.demande d'e /s (selon le préfixe du chemin d'accès requis). S'il détermine qu'il ne faut pas traiter une demande, il déclenche d'autres 'demande' des gestionnaires.
Vous pouvez voir qu'en mettant juste une console.journal d'instruction avant votre writeHead appel et vous verrez que rien n'apparaît dans la sortie standard stdout.
La lecture de la le code source, il semble que socket.io définit automatiquement un
Access-Control-Allow-Origin
- tête avec la valeur de laorigin
en-tête de la demande. Je suppose que il y a un moyen pour définir un tel en-tête du client.Donc, pour clarifier les choses:
1 Votre navigateur falsl retour à xhr-d'interrogation, car il ne supporte pas les websockets ou websocket transport échoue silencieusement
2 Les en-têtes que vous définissez vous-même dans le httpServer
request
événement jamais envoyé, de sorte qu'ils n'ont aucune action sur la Politique de l'origine.solution: trouver un moyen de mettre le
origin
en-tête de la demande. Après l'analyse à travers le code du client, je n'ai trouvé aucune preuve que cela peut être fait facilement.OriginalL'auteur Floby
Une chose à noter est que le '*' valeur ne peut pas être utilisé dans l'Access-Control-Allow-Origin-tête lorsque Access-Control-Allow-Pouvoirs est vrai. Supprimer la Access-Control-Allow-les informations d'Identification de l'en-tête, ou Access-Control-Allow-Origin à la valeur de la demande en-tête d'Origine.
OriginalL'auteur monsur