【问题标题】:JasperServer blocked by CORS policy: No 'Access-Control-Allow-Origin'JasperServer 被 CORS 策略阻止:没有“Access-Control-Allow-Origin”
【发布时间】:2018-12-13 02:21:02
【问题描述】:

我正在尝试在 jasperserver 中启用 CORS 策略。

我正在使用 Angular HTTPClient 调用来自 jasperserver 的 API。

到目前为止我已经尝试过的事情。

修改 apache-tomcat apache-tomcat\conf\web.xml 文件 并在下面添加代码。

<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>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,Accept,Authorization,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern> /* </url-pattern>
</filter-mapping>

来自apache-tomcat 网站。

也试过修改jasperserver\WEB-INF\Web.xml文件 并在下面添加代码

<filter>
<filter-name>CorsFilter2</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

仍然没有运气并遇到此错误。

【问题讨论】:

  • 这里有多个点。首先,您可以尝试将cors.allowed.methods 添加到您的过滤器中。可能需要它,因为根据规范 CORS 以 OPTIONS 请求开头。其次,从&lt;url-pattern&gt; 中删除空格,如第一个配置中所述。第三,您尝试了一个新配置,但似乎您从未更改 &lt;url-pattern&gt; 以使用您的 CorsFilter2,它仍然映射到 CorsFilter。最后,如果响应的标头包含必要的 Access-Control-* 标头,请尝试直接从某个 REST 客户端访问您的 8082 端口。
  • @Siddharth 你说的我试过了,还是不行

标签: apache tomcat cors jasperserver


【解决方案1】:

在为此苦苦挣扎了几个小时后,我想通了。

您必须完全禁用 Jasper 内置的 CorsFilter,并在您的 tomcat 的 /webapps/jasperserver/WEB-INF/web.xml 中添加/映射您自己的过滤器。全局tomcat web.xml不需要干预。

<!-- Comment the built-in filter out.
    <filter>
       <filter-name>CorsFilter</filter-name>
       <filter-class>com.jaspersoft.jasperserver.api.security.csrf.CorsFilter</filter-class>
    </filter>
    -->

    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.origins</param-name>
            <!-- Tomcat 8.5+ doesn't allow '*' any longer in conjuction with 'cors.support.credentials' set to true.
             Instead, a specific comma separated list has to be set here. See https://bz.apache.org/bugzilla/show_bug.cgi?id=62343 -->
            <param-value>http://localhost:9000</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.headers</param-name>
            <!--- If requests contain an authorization header, it has to be added here as well -->
            <param-value>
                Content-Type,X-Requested-With,Accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,X-Remote-Domain,Authorization
            </param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposed.headers</param-name>
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</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>10</param-value>
        </init-param>
    </filter>                
        .......

        <!-- Ensure your newly introduced mapping is first in line -->
            <filter-mapping>
                <filter-name>CorsFilter</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>

        <!-- Also comment out any existing mappings for the built-in filter -->
        <!--
          <filter-mapping>
              <filter-name>CorsFilter</filter-name>
              <url-pattern>*.woff</url-pattern>
          </filter-mapping>
          <filter-mapping>
              <filter-name>CorsFilter</filter-name>
              <url-pattern>*.ttf</url-pattern>
          </filter-mapping>
          <filter-mapping>
              <filter-name>CorsFilter</filter-name>
              <url-pattern>*.svg</url-pattern>
          </filter-mapping>
          <filter-mapping>
              <filter-name>CorsFilter</filter-name>
              <url-pattern>*.eot</url-pattern>
          </filter-mapping>
        -->

【讨论】:

  • @davecar21 对于您的附加信息,我的 jasper 服务器是一个 docker 容器,使用的是 bitnami 的映像 v7.1.1。我使用主机安装的卷覆盖了 web.xml,进行了上面显示的更改,这对我有用。 cors.allowed.origins 中的特定值也很重要,因为 * 不再被接受。
  • 做到了..没用。我的是在 Windows 上运行的本地 7.2
猜你喜欢
  • 2020-01-18
  • 2019-04-26
  • 1970-01-01
  • 2020-04-07
  • 2021-02-01
  • 1970-01-01
  • 2020-12-18
  • 2021-01-16
  • 2019-08-10
相关资源
最近更新 更多