【问题标题】:Allow and configure Access Control Allow Origin允许和配置访问控制允许来源
【发布时间】:2017-10-15 06:35:27
【问题描述】:

我需要允许访问我网站的某个页面以接受来自其他网站的跨域请求。

我知道这种技术是 Cross Origin 或 Cross Domain 或 CORS(Cross-Origin Resource Sharing),我见过几个主题说吧:

How to call a page from another domain to my domain using ajax/javascript
How does Access-Control-Allow-Origin header work?
https://www.html5rocks.com/en/tutorials/cors/

但我不知道如何配置我的网站以允许跨域查询。

信息:需要访问我的网站不使用浏览器扩展,所以我必须练习跨域。

问题:

1. 如何配置Access-Control-Allow-Origin 标头?我的网站是Java-EE、JSF 和Spring。

2.我找到了两种解决方案,可以让外部网站拥有我的页面内容:

  • A) 第一个解决方案是使用 javascript 脚本生成指向我的页面的链接。然后,外部站点必须在其页面中包含此链接以显示我的页面内容。 (我应该还有Access-Control-Allow-Origin 吗?)

例子

<script>
        (function (w,i,d,g,e,t,s) 
            w[d] = w[d]||[];
            t= i.createElement(g);
            t.async=1;
            t.src=e;
            s=i.getElementsByTagName(g)[0];
            s.parentNode.insertBefore(t, s);
        })(window, document,'_gscq','script','//widgets.getsitecontrol.com/42540/script.js');
</script>
  • B) 第二种解决方案是外部站点使用XMLHttpRequest 或AJAX 请求来加载我站点的页面: Embed an External Page Without an Iframe?

    最佳解决方案是什么(A 或 B)?页面内容会静态加载吗?

3. 站点配置中是否有文件允许我授权或禁止站点(域)访问我站点的页面? Access-Control-Allow-Origin Multiple Origin Domains?

例子

my_page_1.html: // Page of my site
// Authorize sites to make a cross domain query
external_site_1.com
external_site_2.com
external_site_3.com

my_page_2.html: // Page of my site
// Authorize sites to make a cross domain query
external_site_1.com

my_page_3.html: // Page of my site
// Authorize sites to make a cross domain query
external_site_1.com
external_site_3.com

提前感谢您的回答。

【问题讨论】:

  • 我认为这与 spring 或 jsf 没有任何关系......我相信它是您需要在服务器/应用程序中设置的配置。您使用的是 spring,所以假设您使用的是 tomcat:Enable CORS on tomcat
  • 对于配置,它看起来是一个不错的解决方案。 &lt;url-pattern&gt; / * &lt;/ url-pattern&gt; 是否允许我在不同页面而不是整个站点上定义 Access-Control-Allow-Origin 还有待观察。我认为它必须是可行的。谢谢你。我还应该知道我应该使用解决方案 A 还是 B。一个想法?
  • 我看了,但我不知道通过请求和最少的操作将我的页面(站点 1)的内容发送到另一个站点(站点 2)的页面的最佳方式是什么网站 2 的份额

标签: javascript spring jakarta-ee cors cross-domain


【解决方案1】:

您可以定义多个具有不同域的过滤器:

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

<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>domain2, domain3</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter2</filter-name>
  <url-pattern>/path2/*</url-pattern>
  <url-pattern>/path3/*</url-pattern>
</filter-mapping>

【讨论】:

  • 好的,它看起来很适合设置。我在web.xml 文件中找到了设置。我将设置我的服务器以允许我需要的页面上的跨域。这是一个好的开始,但我必须知道如何在另一个域的客户页面上提供我的页面内容,而对客户站点所做的更改最少。如果我采用解决方案 B,客户端必须有一个脚本来向我的站点发送 Ajax 请求才能获得我的页面内容。这对他来说有点束缚。使用解决方案 A ,生成指向我的页面内容的链接的脚本,但我不知道该怎么做。
  • 另一个问题,如果我向客户端站点发送请求,它是否也需要在其服务器上配置跨域?
  • 通过过滤器设置,您不需要在客户端进行更多配置吗?你试过了吗?
  • 我还没试过。我阅读了文档,我会做一些测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2017-01-10
  • 2016-01-02
  • 2017-12-15
相关资源
最近更新 更多