Tengo una aplicación web angular y la necesito para comunicarme con una API REST de Jasper Reports Server que se ejecuta en Apache Tomcat. El problema que tengo actualmente es habilitar CORS.
Intenté habilitar CORS con la configuración de Tomcat, pero me di por vencido y estoy buscando crear un proxy inverso usando Nginx.
Tomcat se ejecuta en 192.168.21.18:8080 y puedo acceder al servidor de informes de Jasper en 192.168.21.18:8080/jasperserver/. Estoy ejecutando la aplicación web Angular usando ng serve en mi computadora portátil.
He intentado crear el proxy inverso usando la configuración a continuación
server { listen 8081; server_name _; access_log /var/log/nginx/tomcat-access.log; error_log /var/log/nginx/tomcat-error.log; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; return 204; } location / { proxy_redirect off; rewrite /(.*) /$1 break; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8080/; } } Estoy usando la configuración predeterminada de Tomcat y solo he cambiado la configuración de la aplicación web del administrador. He deshabilitado RemoteAddrValve en $CATALINA_HOME/webapps/manager/META-INF/context.xml
Sin embargo, cuando intento enviar una solicitud POST ahttp://192.168.21.18:8081/jasperserver/rest_v2/reportExecutions , aparece este error.
Access to XMLHttpRequest at 'http://192.168.21.18/jasperserver/login.html' (redirected from 'http://192.168.21.18:8081/jasperserver/rest_v2/reportExecutions') from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.Como puede ver, se le redirige desde http://192.168.21.18:8081 a http://192.168.21.18 (puerto predeterminado 80 ).
Si bien la lógica exacta detrás de la generación de URL depende del código de JasperReports, las aplicaciones de servlet generalmente usan las propiedades serverName y serverPort del objeto ServletRequest para generar la parte de autoridad de la URL.
Debe configurar NGINX para reenviar el encabezado del Host usando:
proxy_set_header Host $http_host;o
proxy_set_header Host $host:8081;Consulte esta respuesta para conocer la diferencia entre las dos directivas;
Alternativamente, puede codificar esos valores en la configuración <Connector> de Tomcat (cf. conector HTTP ):
<Connector ... proxyName="192.168.21.18" proxyPort="8081" /> Observación : dado que no usa RemoteIpValve , Tomcat nunca usa todos esos encabezados X-Forwarded-* que agrega a la solicitud.
Además, en lugar de usar NGINX, puede configurar un CorsFilter en su $CATALINA_BASE/conf/web.xml , para que se aplique a todas las aplicaciones.