JasperReports Server 8.0.0 Deployed on Tomcat CORS错误

oalqel3c  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(141)

当从我的Angular前端应用程序(或通过cURL)调用任何REST Web服务时,我在控制台窗口中收到一个CORS错误。

  • 访问XMLHttpRequest at 'http://<base_url>:8083/jasperserver/rest_v2/login?j_username=username&j_password=password' from origin ' http://<base_url>' has been blocked by CORS policy:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。*

我已经尝试了Web服务库中的其他端点,例如:

  • {{碧玉_url}}/jasperserver/rest_v2/resources?type=reportUnit
  • {{碧玉_url}}/jasperserver/rest_v2/reports/Reports/Case_Status.html?2022-03-07
  • {{碧玉_url}}/jasperserver/rest_v2/serverInfo

我在本地运行Angular或者在安装了JasperReports Server的服务器上运行Angular时也遇到了同样的问题。
我已经按照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来测试“Access-Control-Allow-Origin:http://base_url:8083返回 *”,但http://base_url:8083/jasperserver不返回。这让我相信我的问题纯粹是JasperReports Server的问题,而根本不是Tomcat的问题。

根据this video中详述的进一步调查,Jaspersoft,OPTIONS请求返回403,但GET请求返回200和“Access-Control-Allow-Origin:* ”

我已经从apache-tomcat/conf/web.xml中删除了CORS过滤器,而是直接向jasperserver Web应用程序(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>

在{{碧玉_url}}/jasperserver/rest_v2/serverInfo端点上使用cURL进行测试时,上述CORS配置产生了积极的结果,但其他需要凭据的端点仍然会出现CORS错误。

我不可能是唯一一个在这个问题上挣扎的人,所以如果其他人已经用JasperReports Server的后续版本解决了CORS错误,请帮帮忙!
另外,我正在使用NGINX,并认为我可以使用它来防止CORS错误,类似于this ServerFault question中的答案。然而,我还没有走得那么远,因为我相信一定有一种更简单的方法来做到这一点,通过配置JasperReports Server。
服务器信息

  • 操作系统:Linux Debian 11
  • JasperReports版本:8.0.0
  • Tomcat版本:9.0.5
jq6vz3qz

jq6vz3qz1#

经过多次尝试和错误,我已经解决了这个错误。
我将以下内容添加到/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来表示允许的标题中的Authorized。
我现在可以访问Web服务而不会出现CORS错误

qqrboqgw

qqrboqgw2#

不适用于我的安装(8.2.0,jasperserver-pro)。CSRF保护在配置时总是失败。
然而,我发现类似的东西,但在碧玉配置lvl。在WEB-INF/applicationContext-security-web.xml中搜索<bean id="corsProcessor",在这里您可以配置(正如我所假设的)任何头。我成功地配置了如下的Content-Security-Policy头(甚至工作策略-我的意思是几乎工作,因为我用它来防止加载任何网站到 Jmeter 板)

<entry key="Content-Security-Policy">
                    <util:list>
                        <value>.*</value>
                    </util:list>
                </entry>
<entry key="Content-Security-Policy">
                    <util:list>
                        <value>default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'</value>
                    </util:list>
                </entry>

然而,当我添加CORS头时,它失败了-任何给定的Origin都被添加到CORS头中...

相关问题