Android WebView原生与网页交互常用知识点
2017-12-03 本文已影响1人
独孤流
1、android WebView拦截请求详解
2、android webview一篇文章全面了解(基本使用,url拦截,js跟java交互)
3、APP精细化HTTP分析(一):别再只是代理抓个包了一、设置User-Agent
private WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ano);
webview = (WebView) this.findViewById(R.id.id_wv_ua);
// 得到WebSettings对象
WebSettings settings = webview.getSettings();
// 如果访问的页面中有JavaScript,则WebView必须设置支持JavaScript,否则显示空白页面
webview.getSettings().setJavaScriptEnabled(true);
// 获取到UserAgentString
String userAgent = settings.getUserAgentString();
// 打印结果
Log.i("TAG", "User Agent:" + userAgent);
// 修改ua使得web端正确判断
String ua = webview.getSettings().getUserAgentString();
webview.getSettings().setUserAgentString(ua+"; 自定义标记");
}
}
二、 cookie
2.1 获取cookie
【WebView】Android WebView中的Cookie操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp_web_view);
wvTempShow = (WebView) findViewById(R.id.wv_tempShow);
Intent intent = this.getIntent();
receiveUrl = intent.getStringExtra("openUrl");
//获得cookie管理者
CookieManager cookieManager = CookieManager.getInstance();
//获取登陆时的cookie
String oldCookie = "xxxx=aaaa";
cookieManager.setCookie(receiveUrl, oldCookie);
}
三、伪造Referrer、增加中间页空白跳转
如果需要构造特定的referrer请求的,比如盗图这种特殊业务时实践过程
实际访问地址:https://www.baidu.com
实际访问地址要校验的referrer:https://www.google.com
1、将要访问的实际地址抓换为访问referrer的地址
// 如果是要访问有校验的Referrer,则请求这个Referrer地址
if (mReferer != null){
mWebView.loadUrl(mReferer);
}else {
// 不需要构造Referrer的直接访问目标地址
mWebView.loadUrl(mUrl);
}
2、设置Android的浏览器支持JavaScript对Referrer的获取
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 要支持Referrer的请求,直接返回false,什么处理都不做
return false;
}
3、设置如果请求的是构造的那个Referrer的这个请求,则创建一个本地的伪造response
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
mRefererMap.get
if (mReferer == null){
// 如果不需要构造Referrer,也就是本地构造的mReferer
return super.shouldInterceptRequest(view, request);
}else {
if (mReferer == null){
return super.shouldInterceptRequest(view, request);
}else {
mReferer = null;
String response = "<html>" +
" <META content=\"always\" name=\"referrer\">" +
"<script>" +
"try{" +
"if(window.opener&&window.opener.bds&&window.opener.bds.pdc&&window.opener.bds.pdc.sendLinkLog){" +
"window.opener.bds.pdc.sendLinkLog();}" +
"}catch(e) {};" +
"window.location.replace(\"" +mUrl+
"\")" +
"</script> " +
"<noscript>" +
"<META http-equiv=\"refresh\" content=\"0;URL='" +mUrl+
"'\">" +
"</noscript>" +
"</META>" +
"</html>";
WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));
return webResourceResponse;
}
}
完整例子
public class WebActivity extends Activity {
private final String TAG = "WebActivity";
String mUrl,mReferer;
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
webView = (WebView) findViewById(R.id.webView);
webView.setDefaultHandler(new DefaultHandler());
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (mReferer == null){
return super.shouldInterceptRequest(view, request);
}else {
mReferer = null;
String response = "<html>" +
" <META content=\"always\" name=\"referrer\">" +
"<script>" +
"try{" +
"if(window.opener&&window.opener.bds&&window.opener.bds.pdc&&window.opener.bds.pdc.sendLinkLog){" +
"window.opener.bds.pdc.sendLinkLog();}" +
"}catch(e) {};" +
"window.location.replace(\"" +mUrl+
"\")" +
"</script> " +
"<noscript>" +
"<META http-equiv=\"refresh\" content=\"0;URL='" +mUrl+
"'\">" +
"</noscript>" +
"</META>" +
"</html>";
WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));
return webResourceResponse;
}
}
});
webView.setWebChromeClient(new WebChromeClient() {});
// 测试数据
mUrl = "https://www.baidu.com";
mReferer = "https://www.google.com";
if (mReferer != null && !mReferer.isEmpty()){
mWebView.loadUrl(mReferer);
}else {
mWebView.loadUrl(mUrl);
}
}
}
四、js与原生交互
WebViewJavascriptBridge
wechat_JSBridage
wechat_JSBridage_fork