0

我有一个打开第二个浏览器窗口的 GWT 应用程序。我希望我的第二个窗口能够在第一个窗口的入口点内调用方法。

下面的代码示例在生产(Web)模式下工作,但是当我尝试在托管模式下运行它时,IE 会检测到 XSS 并用单个“#”覆盖页面以防止检测到的攻击。我猜这是因为我的 GWT 代码服务器在 localhost 上运行,而我正在测试的应用程序部署在虚拟机上。

更新:IE XSS 过滤似乎是零星的。有时我可以让页面加载。但过了一会儿,它又开始过滤了。

public class MainWindow implements EntryPoint {
    ...
    @Override
    public void onModuleLoad() {
        registerJSNIFunctions(this);
    }

    private native void registerJSNIFunctions(MainWindow mw) /*-{
        $wnd.sayHi = function (name) {
            mw.@MainWindow::sayHi(Ljava/lang/String;)(name);
        }
    }-*/;

    public void sayHi(String name) {
        alert("Hi " + name); // not valid, but you get the point
    }
    ...
}

public class SecondWindow implements EntryPoint {
    ...
    @Override
    public void onModuleLoad() {
        ...
        sayHi("kylos");
    }

    public static native void sayHi(String name) /*-{
        $wnd.opener.window.$wnd.sayHi(name);
    }-*/;
}

关于如何让它在托管模式下工作的任何想法?或者有没有更好的方法来使用 GWT 进行跨窗口通信?

4

2 回答 2

0

您的问题很有趣,请参阅其他人的意见,但我使用 OAuth 做了类似的事情。

所以,如果最后的想法是从一个窗口调用另一个方法,我会是这样的:

....
   #Maybe if you use window instead of top works as well
   $wnd.opener.top.location.replace(url);             
   $wnd.close();
   ....
....

并在另一个浏览器中等待新请求,解析 url,然后“本地”调用sayHi. 这种方法对您有效吗?

如果您想了解有关 Windows 属性的更多详细信息,您可以查看W3Schools 页面

但基本上:

  • $wnd.opener#returns 返回对创建窗口的窗口的引用。
  • top#返回最顶层的浏览器窗口
于 2013-06-13T08:11:24.703 回答
0

所以这个问题似乎是零星的。我不确定过滤器是如何被触发的,但是当它触发时,重写的页面会被 IE 缓存,因此在浏览器缓存被清空之前,以后的请求肯定会失败。

I also found this Microsoft document that describes a custom header, X-XSS-Protection, that can be used to disable the filter. Obviously, this should only be used on a dev system in hosted mode.

To disable the filter, add the following header to your server configuration:

X-XSS-Protection: 0
于 2013-06-14T12:54:08.820 回答