【问题标题】:Android(4.4+) WebView ignore x-frame-optionsAndroid(4.4+) WebView 忽略 x-frame-options
【发布时间】:2016-09-14 14:37:29
【问题描述】:

我正在尝试在应用中显示带有 iframe 的页面。它显示简单的页面,但不能显示 googlemap iframe。

我试过了: hardvre 加速 - 打开(我知道它只与视频有关), java脚本 - 启用, 使用 web chrome 客户端, loadurl(因为从内部存储器加载)等

代码是:

        wewview = new WebView(getActivity().getApplicationContext());
        wewview.getSettings().setJavaScriptEnabled(true);
        wewview.getSettings().setLoadWithOverviewMode(true);  
        wewview.getSettings().setUseWideViewPort(true);
        wewview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,  
                LayoutParams.MATCH_PARENT));
        wewview.setWebChromeClient(new WebChromeClient());
        if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
            wewview.getSettings().setAllowUniversalAccessFromFileURLs(true);
        }
        wewview.getSettings().setPluginState(WebSettings.PluginState.ON);
        wewview.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND); 

        linearMain.addView(wewview,0);  

        wewview.loadUrl("file://path... /frames.html");

有人可以建议我如何以编程方式为我的 web 视图打开“忽略 x-frame-options”吗?

更新 1

在日志中发现另一条消息

05-19 10:01:49.404: I/chromium(4027): [INFO:CONSOLE(0)] "Refused to display 'https://www.google.ru/maps/@?nogmmr=1' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.", source: about:blank (0)

寻找忽略 x-frame-options

【问题讨论】:

标签: java android iframe webview x-frame-options


【解决方案1】:

找到了路。加载框架上没有完整的交互,但我只需要显示它。所以,Jsoup 用于加载页面内容,但通过标准方式继续加载脚本和图像,这就是全部技巧:

   private class ignoreXHeaderWebClient extends WebViewClient{  
   private static final String URL_MASK       =  "http";


    //api < 21
    @Override
    public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
        WebResourceResponse content = getsPageContent(url);
        if (content != null) {
            return content;
        } else {
            return super.shouldInterceptRequest(view, url);
        }
    }

   // api >= 21
    @Override  
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        WebResourceResponse content = getsPageContent(request.getUrl().toString());
        if (content != null) {
            return content;
        } else {
            return super.shouldInterceptRequest(view, request);  
        }
    }   

    private WebResourceResponse getsPageContent(String url){
        if (( url.contains(URL_MASK)) // guess is better to create for ex map to check all extensions
                && !(( url.contains(".js")) 
                      ||( url.contains(".css"))
                      ||( url.contains(".tiff"))
                      ||( url.contains(".jpg"))
                      ||( url.contains(".png"))
                      ||( url.contains(".gif")))){    
            try {  
                return new WebResourceResponse(
                              "text/html",    
                              "UTF-8",   
                              new ByteArrayInputStream( 
                                   Jsoup.connect(url)
                                           .get()  
                                           .toString()
                                           .getBytes()));  
            } catch (IOException e) {
                e.printStackTrace();    
            }   
        }
        return null;
    } 
}

并申请新课程:

webWiev.setWebViewClient(ignoreXHeaderWebClient);  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2014-05-10
    • 2014-02-11
    相关资源
    最近更新 更多