You need to enable JavaScript to run this app. 通过Nginx反向代理为Tomcat上Jasper Reports配置CORS时预检请求失败
优惠活动
大模型
产品
解决方案
定价
更多

通过Nginx反向代理为Tomcat上Jasper Reports配置CORS时预检请求失败

问题根因

你遇到的报错本质是三个核心问题叠加导致的:

  • Tomcat返回的登录重定向地址跳过了Nginx反向代理:由于你配置了proxy_redirect off,Jasper Server检测到未登录时返回的302跳转地址直接使用了Tomcat自身的服务地址192.168.21.18(无8081端口),该地址没有经过Nginx处理,自然不会携带CORS响应头。
  • CORS配置存在语法冲突:你同时设置了Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true,根据W3C规范,带身份凭证的请求不允许Origin配置为通配符*,浏览器会直接拦截该类响应。
  • 缺失Host头传递:你没有给Tomcat传递Nginx的监听端口,Tomcat生成重定向地址时默认用自身的8080端口,进一步导致跳转地址错误。
修正后的Nginx配置
server {
    listen 8081;
    server_name _;
    access_log      /var/log/nginx/tomcat-access.log;
    error_log       /var/log/nginx/tomcat-error.log;

    # 动态取请求的Origin,适配带凭证的CORS请求
    add_header 'Access-Control-Allow-Origin' $http_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' $http_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';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
    }

    location / {
        # 传递Nginx的主机+端口给Tomcat,保证生成的重定向地址正确
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Forwarded-Host $host:$server_port;
        proxy_set_header        X-Forwarded-Server $host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        # 自动修正Tomcat返回的重定向地址,替换为Nginx的访问地址
        proxy_redirect          http://192.168.21.18:8080/ http://$host:$server_port/;
        proxy_pass              http://192.168.21.18:8080/;
    }
}
额外配置说明
  1. 修改完配置后执行nginx -s reload重载配置生效。
  2. Angular端发送请求时需要开启withCredentials: true,保证认证Cookie可以正常传递,避免Jasper Server反复跳转登录页。如果用的是Basic认证,直接在请求头携带Authorization字段也可以跳过登录跳转。
  3. 本地开发阶段也可以直接使用Angular自带的代理配置,不需要额外部署Nginx,在项目根目录新增proxy.conf.json配置后用ng serve --proxy-config proxy.conf.json启动即可。

内容的提问来源于stack exchange,提问作者Steven John Lally

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 13:12:03