拒绝显示一个框架,因为它在Android webview中将X-Frame-Options设置为“DENY”

时间:2015-02-18 01:23:15

标签: javascript android html webview android-webview

当我尝试在webview中显示Google日历时,会显示一些错误:

[INFO:CONSOLE(0)] "Refused to display 'https://accounts.google.com/ServiceLogin?service=cl&passive=1209600&continue=https://www.google.com/calendar/embed?src%3Detlwhk@gmail.com%26ctz%3DAsia/Hong_Kong&followup=https://www.google.com/calendar/embed?src%3Detlwhk@gmail.com%26ctz%3DAsia/Hong_Kong&btmpl=mobile&ltmpl=mobilex&scc=1' in a frame because it set 'X-Frame-Options' to 'DENY'.", source: about:blank (0)

这是html代码

<p><iframe style="border: 0;" src="https://www.google.com/calendar/embed?src=etlwhk%40gmail.com&amp;ctz=Asia/Hong_Kong&amp;output=embed" width="800" height="600" frameborder="0" scrolling="no"></iframe></p>

对于android方面,它是一些简单的webview代码

        StringBuilder sb = new StringBuilder();
        sb.append("<HTML><HEAD><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0'><style>img{display: inline; height: auto; max-width: 100%}iframe{width:100%}</style></HEAD><body>");
        sb.append(page.page_content_chi.toString());
        sb.append("</body></HTML>");
        webview.loadDataWithBaseURL("file:///android_asset/", sb.toString(), "text/html", "utf-8", null); 

如何修复错误?谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

您需要公开日历。这就是正在发生的事情 - 由于您尝试显示的日历未公开共享,因此Google日历首先想知道您是谁,以便决定向您显示的内容,因此它会将您发送给Google登录页面。登录页面通过禁止在iframe中显示自身来保护自己免受点击劫持('X-Frame-Options' is set to 'DENY'意味着什么)。

如果您公开显示日历,则日历只会显示日历,而不会先尝试登录。有关如何共享日历的信息,请参阅:https://support.google.com/calendar/answer/37083

您可以在桌面上轻松测试是否可以在WebView中使用,方法是创建一个将日历嵌入到iframe中的简单测试页,然后在Google Chrome的隐身窗口中打开它,您无需登录Google服务。在您公开分享日历之前,Chrome也会拒绝显示日历。

答案 1 :(得分:0)

如果您的日历未公开,请确保您已登录并接受第三方cookie。否则,谷歌会将您转发到登录页面,这会导致错误,因为在iframe中,谷歌会拒绝访问。