Android WebView 内处理302重定向

Posted 滕玉坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android WebView 内处理302重定向相关的知识,希望对你有一定的参考价值。

感谢这篇博文帮我解决了问题:http://qbeenslee.com/article/android-webview-302-redirect/

核心思想:通过记录访问历史url,在返回时候对url进行过滤出来。

public class NewsDetailActivity extends AppCompatActivity
    private WebViewWithProgress myWebViewWithProgress;
    private WebView myWebView;
    private String newsDetailURL;

    /**
     * 记录URL的栈
     * 规则:
     * 1.不可在@code WebView.onPageFinished();中开始记录URL
     * 2.记录需要屏蔽重定向URL
     * */
    private final Stack<String> mUrls=new Stack<>();
    /**
     * 判断页面是否加载完成
     * */
    private boolean mIsloading=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_detail);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        

        Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
        setSupportActionBar(toolbar);
        // Show the Up button in the action bar.
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) 
            actionBar.setDisplayHomeAsUpEnabled(true);
        

        // 查找浏览器控件ID
        myWebViewWithProgress = (WebViewWithProgress) findViewById(R.id.MyWebViewContent);

        //获取浏览器
        myWebView = myWebViewWithProgress.getWebView();

        // 设置页面支持javascript
        myWebView.getSettings().setJavaScriptEnabled(true);

        //缩放开关
        //设置此属性,仅支持双击缩放,不支持触摸缩放(android4.0)
        myWebView.getSettings().setSupportZoom(true);
        // 设置是否可缩放
        myWebView.getSettings().setBuiltInZoomControls(true);
        //将图片调整到适合WebView的大小
        myWebView.getSettings().setUseWideViewPort(true);
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.getSettings().setUseWideViewPort(true);

        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        //设置图片自动加载
        myWebView.getSettings().setLoadsImagesAutomatically(true);

        newsDetailURL = getIntent().getStringExtra("newsDetailURL");


        // 设置WebView监听事件
        myWebView.setWebViewClient(new WebViewClient() 
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                // TODO Auto-generated method stub
                return false;
            

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) 
                if(mIsloading &&mUrls.size()>0)
                
                    mUrls.pop();
                
                recordUrl(url);
                super.onPageStarted(view, url, favicon);
            

            @Override
            public void onPageFinished(WebView view, String url) 
                Log.v("FairyDebug", "URL加载完毕" + url);
                super.onPageFinished(view, url);
                if(mIsloading|| url.startsWith("about:"))
                
                    mIsloading=false;
                
            


        );

        Log.v("FairyDebug","--------get---------------"+newsDetailURL);
        // 加载URL
        myWebView.loadUrl(newsDetailURL);


    
    /**
     * 记录非重定向链接 避免刷新页面造成的重复入栈*/
    private void recordUrl(String url)
    
        //这里还可以根据自身业务来屏蔽一些链接放入URL栈
        if(!TextUtils.isEmpty(url)&& !url.equalsIgnoreCase(getLastPageUrl()))
            mUrls.push(url);
        
    

    /**获取上一页的链接*/
    private synchronized  String getLastPageUrl()
        return mUrls.size()>0 ? mUrls.peek():null;
    

    /**推出上一页链接*/
    public String popLastPageUrl()
        if(mUrls.size()>=2)
        
            mUrls.pop();// pop current page url
            return mUrls.pop();
        
        return  null;
    


  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126

后话:

若没有设置 WebViewClient 则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。
若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。

以上是关于Android WebView 内处理302重定向的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate 支持服务器内302重定向

从 Chrome 重定向到带有位置标头的 302 后被阻止的 Android 应用

处理 http 302 重定向响应

302 使用 Dropbox 短超链接在 Android 中从 http 重定向到 https

无法在 ajax 中处理 302 重定向,为啥? [复制]

Http 302 重定向到深层链接在 Android 中不起作用