在Android开发过程中,使用过WebView的童鞋可能难免会遇到URL重定向问题。
解决方案
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
就是直接返回false,就可以解决重定向问题。
shouldOverrideUrlLoading :这个方法的返回值
return true 表示当前url即使是重定向url也不会再执行(除了在return true之前使用webview.loadUrl(url)除外,因为这个会重新加载)
return false 表示由系统执行url,直到不再执行此方法,即加载完重定向的ur(即具体的url,不再有重定向)
WebView加载重定向页面会遇到问题。
1.如果需要获取webview访问的url地址,那么加载重定向页面时会显示两次
2.如果WebView在加载页面的过程中,有加载重定向页面,那么在Android2.3版本中会遇到无法回退的问题,但是4.0以上系统不会。例如,用户在点击回退时,webview会执行goBack()方法,2.3系统不能正常回退,而4.0能正常回退,可以解释为4.0系统的webview对重定向做了处理,他会把重定向的两个页面看做是一个页面,所以webview成功回退了,但是2.3系统的webview会先回退到重定向页面(非真正的目的页面),回退之后会执行loadUrl(url)方法,而这是因为url是个重定向url,所以会跳转到真正的目标页面,so,经过两次加载,页面还是回到goBack()之前的页面!
问题2的解决方案:
从重定向的概念可知,当访问重定向url时服务器会返回301状态码,那么可以根据此特殊的状态码来把重定向页面排除在历史访问记录队列里。
具体思路为:
(1)自定义一个历史url访问队列——MyWebBackForwardList
(2)在webview每次loadUrl(url)之前先用HttpUrlConnection对象的getResponseCode()方法来获取状态码,如果==301,不加入队列中,否者加入。
(3)重写webview的canGoBack()和goBack()方法
不再使用webview的WebBackForwardList对象来取历史url,而是使用自定义的MyWebBackForwardList来取出回退的url