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 出现在请求的资源上。

我尝试过网络服务库中的其他端点,例如:

我在 运行 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 来做到这一点。

服务器信息

经过反复试验,我已经稍微解决了这个错误。

我在 /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 服务