1

我在调用同一网络内另一台服务器的另一个网站中的 JS 函数时遇到问题。我的脚本按以下方式工作:

在服务器 1(IP:192.168.1.17)的页面中有一个表单,它有一个按钮,可以从服务器 2(IP:162.168.1.18)的页面打开一个弹出窗口并显示项目列表。通过双击列表中的一项,页面执行opener.setearProducto函数,检索 aString 作为参数。但此时,Firebug 向我显示一条消息:“错误:访问属性 'setearProductos' 的权限被拒绝”并且脚本不起作用。这很奇怪,因为当我在同一台 PC 上测试它时,一切都完美无缺。

我在谷歌上搜索并注意到需要安装CORS。但是当我在两台服务器上安装它时,脚本仍然不起作用。我还尝试将标头Access-Control-Allow-Origin添加到 JSP 文件中,但也没有用。

我不知道问题是否与应用程序中使用的框架有关:Struts 2 和 Spring。

我需要帮助,因为我不知道该怎么做。

如果有帮助,我附上我的web.xml 。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- CORS -->
    <filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    </filter>
    <!-- configuraicond e Struts y Spring -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>sistema.cron.TareasProgramadas</listener-class>
    </listener>
    <listener>
        <listener-class>sistema.base.logica.ControlServicios</listener-class>
    </listener>

    <!-- inicio CORS -->
    <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- inicio Struts -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <session-config>
        <session-timeout>
            120
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
4

2 回答 2

0

我相信您已经错过了如下的“init-param”设置

    <init-param>
            <param-name>cors.allowOrigin</param-name>
            <param-value>http://example.com</param-value>
    </init-param>

在这里找到

需要指定这一点的原因是浏览器创建了一定的保护,因此您不能简单地对任何外部站点进行远程调用。

我建议在HTML5Rocks:使用 CORS站点上阅读有关它的内容。简而言之,当您向外部域发出 http POST 请求时,浏览器将首先使用某些参数进行 http OPTIONS 调用,服务器将使用这些参数来确定是否进行调用,然后浏览器将用于知道它是否可以继续执行 POST 请求。

于 2013-06-04T03:25:33.723 回答
0

从外观上看,您违反了 Javascript 的same-origin-policy。简而言之:您的浏览器从服务器 1(IP:192.168.1.17)获取页面,但稍后它想要执行驻留在服务器 2(IP:192.168.1.18)中的脚本。这是 javascript 领域的禁忌。维基百科文章解释了 3 种可以放松此限制的方法。

如果您决定采用 Ajax 方式,还有第四种选择,也是个人最喜欢的 JSONP 方式。

当您说:

我将它安装在两台服务器上

CORS 不是您安装的东西。这是一个 HTTP 扩展,其中想要违反同源策略的浏览器实际上告诉 Web 服务器(通过 HTTP 标头扩展Origin)它想要在从另一个 Web 服务器带来的页面内执行代码。把它放在你的场景中:你的浏览器从服务器 1 打开页面,然后联系服务器 2 以执行额外的代码,它告诉 Web 服务器

我最初从服务器1带来了页面。您是否允许在他的页面中执行您的代码?

并且需要对 Web 服务器 2 进行配置(无需安装 AFAIK),哪些是它信任的源服务器,哪些不是。

当一切都驻留在同一台 PC 中时,它起作用的原因是初始网页和opener.setearProducto您希望调用的额外代码的来源是相同的。

于 2013-06-04T03:30:15.073 回答