Comment puis-je append des en-têtes CORS à un serveur de connexion statique?

Je suis en train d’écrire un petit serveur Web de démonstration contenant du code HTML, CSS et JavaScript. Le serveur ressemble à

(function () { "use ssortingct"; var http = require("http"); var connect = require('connect'); var app = connect() .use(connect.logger('dev')) .use(connect.static('home')); var server = http.createServer(app); server.listen(9999, function () { console.log('server is listening'); }); })(); 

Le javascript côté client effectue des appels ajax vers un autre serveur. Comment puis-je append

 Access-Control-Allow-Origin: http://example.com 

à la réponse de mon serveur, de sorte que le javascript côté client puisse effectuer l’appel ajax?

Avait un peu de difficulté à comprendre celui-ci depuis express m’a gâté.

Jetez un coup d’œil à enable cors . Ce que vous devez faire est essentiellement d’append Access-Control-Allow-Origin au domaine sur lequel vous voulez activer cors. response.setHeaders est parfait pour cette tâche.

Une autre chose à noter est que connect n’a aucun moyen de gérer les itinéraires. Si votre application doit avoir des itinéraires différents, vous devrez probablement écrire une logique pour chacune d’elles et append des en-têtes de résolution à ceux sur lesquels vous souhaitez activer cors. Vous pouvez utiliser req.url pour cela.

 var http = require("http"); var connect = require('connect'); var app = connect() .use(connect.logger('dev')) .use(connect.static('home')) .use(function(req, res){ res.setHeader("Access-Control-Allow-Origin", "http://example.com"); res.end('hello world\n'); }); var server = http.createServer(app); server.listen(9999, function () { console.log('server is listening'); }); 

C’est la réponse que j’ai eue en chrome dev tools

 HTTP/1.1 200 OK Access-Control-Allow-Origin: http://example.com Date: Sat, 15 Jun 2013 16:01:59 GMT Connection: keep-alive Transfer-Encoding: chunked 

J’espère que cela aidera:

 //CORS middleware var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', config.allowedDomains); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); } //... app.configure(function() { app.use(allowCrossDomain); app.use(express.static(__dirname + '/public')); }); 

Plus de détails: Comment autoriser CORS?

La méthode la plus simple, si vous utilisez gulp, consiste à utiliser le plugin gulp appelé “gulp-connect” et “connect-modrewrite” et à définir un nouveau gulptask pour redirect une API particulière. Cela a pour but de faire en sorte qu’apache agisse en tant que proxy pour chaque API particulière, afin de contourner la demande de pré-vol afin d’éviter le problème des COR. J’ai utilisé la tâche d’abat suivante pour surmonter ce problème.

 var connect = require('gulp-connect'), modRewrite = require('connect-modrewrite'); /** * Proxy Config */ gulp.task('connect', function () { connect.server({ root: ['./.tmp', './.tmp/{folderLocations}', './src', './bower_components'], port: 9000, livereload: true, middleware: function (connect, opt) { return [ modRewrite([ '^/loginProxy/(.*)$ http://app.xyzdomain.com/service/login/auth/$1 [P]' ]) ]; } }); }); 

express.static prend un object de configuration. Vous pouvez fournir la propriété setHeaders et à partir de cette fonction, vous pouvez définir des en-têtes pour la réponse:

  app.use(express.static('public', { setHeaders: function setHeaders(res, path, stat) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET'); res.header('Access-Control-Allow-Headers', 'Content-Type'); } })) 

Les parameters de cette fonction sont:

  • res , l’object de réponse.
  • path , le path du fichier qui est envoyé.
  • stat , l’object stat du fichier en cours d’envoi.

Je souhaite que la demande soit disponible ici pour pouvoir conditionnellement définir les en-têtes CORS en fonction de l’en-tête Origin .