当从我的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
2条答案
按热度按时间jq6vz3qz1#
经过多次尝试和错误,我已经解决了这个错误。
我将以下内容添加到/apache-tomcat/webapps/jasperserver/WEB-INF/web. xml文件中:
我唯一的错误是我需要一个大写的A来表示允许的标题中的Authorized。
我现在可以访问Web服务而不会出现CORS错误
qqrboqgw2#
不适用于我的安装(8.2.0,jasperserver-pro)。CSRF保护在配置时总是失败。
然而,我发现类似的东西,但在碧玉配置lvl。在
WEB-INF/applicationContext-security-web.xml
中搜索<bean id="corsProcessor"
,在这里您可以配置(正如我所假设的)任何头。我成功地配置了如下的Content-Security-Policy
头(甚至工作策略-我的意思是几乎工作,因为我用它来防止加载任何网站到 Jmeter 板)然而,当我添加CORS头时,它失败了-任何给定的Origin都被添加到CORS头中...