拒绝显示框架,因为它在android webview中设置了“拒绝”x - frame选项

时间:2023-01-10 13:47:41

When I try to show the google calendar in webview , it show some error:

当我试图在webview中显示谷歌日历时,它显示了一些错误:

[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)

And this is the html code

这是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>

And for the android side it is some simple webview code

对于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); 

How to fix the error? Thanks for helping.

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

1 个解决方案

#1


5  

You need to make your calendar public. This is what is happening -- as the calendar you are trying to display isn't shared publicly, Google Calendar first wants to know who you are in order to decide on what to show to you, so it sends you to the Google login page. The login page protects itself from click hijacking by disallowing displaying itself in an iframe (that's what 'X-Frame-Options' is set to 'DENY' means).

你需要公开你的日历。这就是正在发生的事情——由于您试图显示的日历没有公开共享,谷歌日历首先希望知道您是谁,以便决定向您显示什么,因此它将您发送到谷歌登录页面。登录页面不允许在iframe中显示自己(这就是“X-Frame-Options”被设置为“DENY”的意思),从而保护自己不受点击劫持。

If you make the calendar publicly visible, Calendar will just show it, without trying to log you in first. On how to share the calendar, see this: https://support.google.com/calendar/answer/37083

如果您使日历公开可见,日历将只显示它,而不尝试先登录。关于如何共享日历,请参见:https://support.google.com/calendar/answer/37083

You can trivially test on desktop whether this will work in WebView by creating a simple test page that embeds the calendar in an iframe, and then opening it in an Incognito window of Google Chrome, where you are not logged into Google services. Chrome will also be refusing to show Calendar until you make it publicly shared.

通过创建一个简单的测试页面,将日历嵌入到iframe中,然后在谷歌Chrome的隐身窗口中打开它,在这个窗口中您不会登录到谷歌服务。Chrome也将拒绝显示日历,直到你公开共享。

#1


5  

You need to make your calendar public. This is what is happening -- as the calendar you are trying to display isn't shared publicly, Google Calendar first wants to know who you are in order to decide on what to show to you, so it sends you to the Google login page. The login page protects itself from click hijacking by disallowing displaying itself in an iframe (that's what 'X-Frame-Options' is set to 'DENY' means).

你需要公开你的日历。这就是正在发生的事情——由于您试图显示的日历没有公开共享,谷歌日历首先希望知道您是谁,以便决定向您显示什么,因此它将您发送到谷歌登录页面。登录页面不允许在iframe中显示自己(这就是“X-Frame-Options”被设置为“DENY”的意思),从而保护自己不受点击劫持。

If you make the calendar publicly visible, Calendar will just show it, without trying to log you in first. On how to share the calendar, see this: https://support.google.com/calendar/answer/37083

如果您使日历公开可见,日历将只显示它,而不尝试先登录。关于如何共享日历,请参见:https://support.google.com/calendar/answer/37083

You can trivially test on desktop whether this will work in WebView by creating a simple test page that embeds the calendar in an iframe, and then opening it in an Incognito window of Google Chrome, where you are not logged into Google services. Chrome will also be refusing to show Calendar until you make it publicly shared.

通过创建一个简单的测试页面,将日历嵌入到iframe中,然后在谷歌Chrome的隐身窗口中打开它,在这个窗口中您不会登录到谷歌服务。Chrome也将拒绝显示日历,直到你公开共享。