node.js y geoserver CORS

Tengo el servidor node.js 0.10.12 y express.js 4.8.5. Node.js es el servidor web, incluye openlayers 3.9.0.

Geoserver 2.1.3 sirve la capa WMS. Más adelante, implementaré capas vectoriales.

Solo hay una ruta (para la página índice)

var routes = require('./routes/index'); 

El index.js contiene

 var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.render('index', { title: 'openlayers3 testing', head: 'Welcome' }); next(); }); module.exports = router; 

Así que la app.js tiene

 var routes = require('./routes/index');//explained above var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(favicon()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); 

Agregué lo siguiente para CORS

 app.use(function (req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); res.setHeader('Access-Control-Allow-Credentials', true); next(); }); app.get('/', routes); 

Y en el index.ejs configuro mi capa de Geoserver WMS como esta

 var ait = new ol.layer.Tile({ extent: textent, source: new ol.source.TileWMS({ url: 'http://localhost:8080/geoserver/mymap/wms', crossOrigin: 'anonymous', attributions: [new ol.Attribution({ html: '© ' +'' +'National parks / geo.admin.ch' })], params: {'LAYERS': 'mymap:planet_osm_polygon, mymap:planet_osm_line, mymap:planet_osm_roads, mymap:planet_osm_point'}, serverType: 'geoserver' }) 

})

Y me sale el error

Image from origin 'http://localhost:8080' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5550' is therefore not allowed access.

Probé muchas variaciones que encontré en línea. Puse el código antes de app.use(express.static(path.join(__dirname, 'public'))); . Lo puse dentro del router.get del index.js . Todavía nada. No logro entender lo que está mal.

Gracias

notas

Esto funciona en internet explorer 11. No hay errores y puedo ver la capa

No hay errores en Firefox 30 pero no puedo ver la capa

En Chrome 45 no puedo ver la capa y me sale ese error.

Olvídese de 'Access-Control-Allow-Origin', '*' es un gran riesgo para la seguridad. En su lugar, establezca el nombre del dominio solicitante y mantenga una lista blanca de dominios.

Creo que es obvio que su middleware no establece los encabezados en la respuesta http://localhost:8080 . Verifique los encabezados en el panel de red, firebug, etc … y depúrelos. Cómo depurar los encabezados de respuesta http de una llamada HTTP

Firefox no maneja los errores de CORS siempre de manera adecuada, por lo que también debes revisar Chrome. Internet explorer funciona de forma diferente a los demás: https://stackoverflow.com/a/22450633/607033 por lo que acepta http://localhost:5550 como el mismo origen, por eso su código de error funciona en msie. Intente usar dominios con nombre personalizados agregando el archivo de hosts, y estoy seguro de que también recibirá un mensaje de error de msie.

editar – para ponerse al día con los comentarios

El principal problema con el código de ejemplo es que la aplicación web (dominio: http://localhost:5550 ) devuelve sus encabezados CORS. Dado que la aplicación web desea acceder al geoserver ( http://localhost:8080 ) desde el navegador, el geoserver debe otorgar acceso y no la aplicación web. Así que el geoservidor debería devolver los encabezados CORS en lugar de la aplicación web.

Según slevin, no es posible con la versión de geoserver que utilizan actualmente. Una posible solución para agregar un proxy inverso y servir el geoservidor en una subcarpeta de la aplicación web o servir la aplicación web en una subcarpeta del geoservidor. De esta manera ambos tendrían el mismo origen. Otra opción para seguir con diferentes dominios, pero agregar los encabezados CORS a la respuesta del geoserver usando el proxy inverso.

Intente iniciar google-chrome con la seguridad deshabilitada y permita el acceso a archivos locales

 google-chrome --disable-web-security --allow-file-access-from-files 

Esto deshabilitará la misma política de origen y permitirá que los archivos locales se accedan entre sí.

Puede recibir avisos de seguridad y estabilidad, puede evitarlo para el desarrollo.