JasperReports Server 8.0.0 已部署 Tomcat CORS 错误
JasperReports Server 8.0.0 Deployed on Tomcat CORS Errors
当从我的 Angular front-end 应用程序(或通过 cURL)调用任何 REST Web 服务时,我在控制台 window 中收到一个 CORS 错误.
从来源 'http://<base_url>' 到 'http://<base_url>:8083/jasperserver/rest_v2/login?j_username=username&j_password=password' 处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow-Origin' header 出现在请求的资源上。
我尝试过网络服务库中的其他端点,例如:
- {{jasper_url}}/jasperserver/rest_v2/resources?type=reportUnit
- {{jasper_url}}/jasperserver/rest_v2/reports/Reports/Case_Status.html?report_date=2022-03-07
- {{jasper_url}}/jasperserver/rest_v2/serverInfo
我在 运行 Angular 本地或安装了 JasperReports Server 的服务器上遇到了同样的问题。
我已按照 this tutorial 将我的服务器域列入白名单,我也尝试将所有带有“*”的域列入白名单,但没有成功,即使在重新启动 Tomcat 后也是如此。
我已经按照这个 Stack Overflow question 的答案用下面的配置更新了 apache-tomcat/conf/web.xml,但是没有运气,即使在重新启动 Tomcat 之后也是如此。
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
在将上述过滤器应用于 Tomcat 之后,我可以通过使用 cURL 来测试 http://[= 返回了“Access-Control-Allow-Origin: *”来确认90=]:8083,但不适用于 http://base_url:8083/jasperserver。这让我相信我的问题纯粹是 JasperReports Server,而不是 Tomcat。
根据 Jaspersoft 博士在 this video 中详述的进一步调查,OPTIONS 请求 returns 403,但 GET 请求 returns 200 和“Access-Control-Allow-Origin : *"
我已经从 apache-tomcat/conf/web.xml 中删除了 CORS 过滤器,而是直接向 jasperserver 网络应用程序添加了一个类似的过滤器 (apache-tomcat/webapps/jasperserver/WEB-INF/web.xml) ,其中 base_url 显然替换为服务器的 URL.
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://base_url, https://base_url, http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,PUT,OPTIONS,DELETE,PATCH</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Cache-Control,X-Suppress-Basic,Origin,Accept,X-Requested-With,Content-Type,Pragma,accept-timezone,withCredentials,X-Remote-Domain,X-Is-Visualize,x-jrs-base-url,Content-Disposition,Content-Description,Content-Type,X-Requested-With,Accept,Accept-Encoding,Accept-Language,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Connection,Host,authorization,Options</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>300</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在 {{jasper_url}}/jasperserver/rest_v2/serverInfo 端点上使用 cURL 进行测试时,上述 CORS 配置产生了积极的结果,但其他需要凭据的端点仍然出现 CORS 错误.
我不是唯一一个为此苦苦挣扎的人,所以如果其他人已经解决了 JasperReports Server 更高版本的 CORS 错误,请帮忙!
顺便说一句,我正在使用 NGINX 并认为我可以使用它来防止 CORS 错误,类似于 this ServerFault question 中的答案。但是,我还没有走那么远,因为我确信一定有一种更简单的方法可以通过配置 JasperReports Server 来做到这一点。
服务器信息
- 操作系统:LinuxDebian 11
- JasperReports 版本:8.0.0
- Tomcat版本:9.0.5
经过反复试验,我已经稍微解决了这个错误。
我在 /apache-tomcat/webapps/jasperserver/WEB-INF/web.xml 文件中添加了以下内容:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<!-- Update allowed origins and remove localhost for non-dev environments -->
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://dev.greydom.com, https://dev.greydom.com, http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,PUT,OPTIONS,DELETE,PATCH</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Cache-Control,X-Suppress-Basic,Origin,Accept,X-Requested-With,Content-Type,Pragma,accept-timezone,withCredentials,X-Remote-Domain,X-Is-Visualize,x-jrs-base-url,Content-Disposition,Content-Description,Content-Type,X-Requested-With,Accept,Accept-Encoding,Accept-Language,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Connection,Host,Authorization,Options</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>300</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我唯一的错误是我需要一个大写的 A 来表示允许的授权 headers。
我现在可以访问没有 CORS 错误的 Web 服务
当从我的 Angular front-end 应用程序(或通过 cURL)调用任何 REST Web 服务时,我在控制台 window 中收到一个 CORS 错误.
从来源 'http://<base_url>' 到 'http://<base_url>:8083/jasperserver/rest_v2/login?j_username=username&j_password=password' 处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow-Origin' header 出现在请求的资源上。
我尝试过网络服务库中的其他端点,例如:
- {{jasper_url}}/jasperserver/rest_v2/resources?type=reportUnit
- {{jasper_url}}/jasperserver/rest_v2/reports/Reports/Case_Status.html?report_date=2022-03-07
- {{jasper_url}}/jasperserver/rest_v2/serverInfo
我在 运行 Angular 本地或安装了 JasperReports Server 的服务器上遇到了同样的问题。
我已按照 this tutorial 将我的服务器域列入白名单,我也尝试将所有带有“*”的域列入白名单,但没有成功,即使在重新启动 Tomcat 后也是如此。
我已经按照这个 Stack Overflow question 的答案用下面的配置更新了 apache-tomcat/conf/web.xml,但是没有运气,即使在重新启动 Tomcat 之后也是如此。
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
在将上述过滤器应用于 Tomcat 之后,我可以通过使用 cURL 来测试 http://[= 返回了“Access-Control-Allow-Origin: *”来确认90=]:8083,但不适用于 http://base_url:8083/jasperserver。这让我相信我的问题纯粹是 JasperReports Server,而不是 Tomcat。
根据 Jaspersoft 博士在 this video 中详述的进一步调查,OPTIONS 请求 returns 403,但 GET 请求 returns 200 和“Access-Control-Allow-Origin : *"
我已经从 apache-tomcat/conf/web.xml 中删除了 CORS 过滤器,而是直接向 jasperserver 网络应用程序添加了一个类似的过滤器 (apache-tomcat/webapps/jasperserver/WEB-INF/web.xml) ,其中 base_url 显然替换为服务器的 URL.
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://base_url, https://base_url, http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,PUT,OPTIONS,DELETE,PATCH</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Cache-Control,X-Suppress-Basic,Origin,Accept,X-Requested-With,Content-Type,Pragma,accept-timezone,withCredentials,X-Remote-Domain,X-Is-Visualize,x-jrs-base-url,Content-Disposition,Content-Description,Content-Type,X-Requested-With,Accept,Accept-Encoding,Accept-Language,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Connection,Host,authorization,Options</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>300</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在 {{jasper_url}}/jasperserver/rest_v2/serverInfo 端点上使用 cURL 进行测试时,上述 CORS 配置产生了积极的结果,但其他需要凭据的端点仍然出现 CORS 错误.
我不是唯一一个为此苦苦挣扎的人,所以如果其他人已经解决了 JasperReports Server 更高版本的 CORS 错误,请帮忙!
顺便说一句,我正在使用 NGINX 并认为我可以使用它来防止 CORS 错误,类似于 this ServerFault question 中的答案。但是,我还没有走那么远,因为我确信一定有一种更简单的方法可以通过配置 JasperReports Server 来做到这一点。
服务器信息
- 操作系统:LinuxDebian 11
- JasperReports 版本:8.0.0
- Tomcat版本:9.0.5
经过反复试验,我已经稍微解决了这个错误。
我在 /apache-tomcat/webapps/jasperserver/WEB-INF/web.xml 文件中添加了以下内容:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<!-- Update allowed origins and remove localhost for non-dev environments -->
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://dev.greydom.com, https://dev.greydom.com, http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,PUT,OPTIONS,DELETE,PATCH</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Cache-Control,X-Suppress-Basic,Origin,Accept,X-Requested-With,Content-Type,Pragma,accept-timezone,withCredentials,X-Remote-Domain,X-Is-Visualize,x-jrs-base-url,Content-Disposition,Content-Description,Content-Type,X-Requested-With,Accept,Accept-Encoding,Accept-Language,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Connection,Host,Authorization,Options</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>300</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我唯一的错误是我需要一个大写的 A 来表示允许的授权 headers。
我现在可以访问没有 CORS 错误的 Web 服务