Android WebView 使用Authorization、Cookie

初始化Webview关键代码:设置拦截连接中的Authorization、Cookie使用

初始化Webview

void initWebView() {

webview = viewBinding.webDetail;

webview.setBackgroundColor(0); //背景透明

//webview.setLayerType(View.LAYER_TYPE_SOFTWARE,null); //关闭硬件加速

WebSettings webSettings = webview.getSettings();//声明WebSettings子类

//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript

// 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)

// 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可

webSettings.setJavaScriptEnabled(true);

webSettings.setDomStorageEnabled(true);

/**

* 用WebView显示图片,可使用这个参数 设置网页布局类型:

* 1、LayoutAlgorithm.NARROW_COLUMNS : 适应内容大小

* 2、LayoutAlgorithm.SINGLE_COLUMN:适应屏幕,内容将自动缩放

*/

webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

//设置自适应屏幕,两者合用

webSettings.setUseWideViewPort(true);

webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作

webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。

webSettings.setBuiltInZoomControls(false); //设置内置的缩放控件。若为false,则该WebView不可缩放

webSettings.setDisplayZoomControls(true); //隐藏原生的缩放控件

//其他细节操作

webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存

webSettings.setAllowFileAccess(true); //设置可以访问文件

webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

webSettings.setAllowFileAccessFromFileURLs(true); // 允许通过 file url 加载的 Javascript 读取其他的本地文件,包括其他的文件和 http,https 等其他的源,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止

webSettings.setAllowUniversalAccessFromFileURLs(true); // 如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用

webview.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

//这部分代码好像并不会触发

Map Headers = request.getRequestHeaders();

for (String value : Headers.values()) {

Log.e("myweb", "Value = " + value);

}//

String bearer = "Bearer " + httpConfig.access_token;

HashMap headerMap = new HashMap();

headerMap.put("Authorization", bearer);

Log.e("myweb", "url:" + request.getUrl().toString());

Log.e("myweb", "Authorization :" + bearer);

view.loadUrl(request.getUrl().toString(), headerMap);

return super.shouldOverrideUrlLoading(view, request);

}

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

//这部分代码好像并不会触发

String bearer = "Bearer " + httpConfig.access_token;

HashMap headerMap = new HashMap();

headerMap.put("Authorization", bearer);

Log.e("myweb", "url:" + url);

Log.e("myweb", "Authorization :" + bearer);

view.loadUrl(url, headerMap);

return false;

}

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

//设定加载开始的操作

showLoading();//自定义加载框

}

@Override

public void onPageFinished(WebView view, String url) {

//设定加载结束的操作

hideLoading();//自定义加载框

}

@Override

public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {

super.onReceivedError(view, request, error);

Log.e("myweb", "错误url:" + request.getUrl().toString());

Log.e("myweb", "错误代码:" + error.getErrorCode());

Log.e("myweb", "错误代码:" + error.getDescription());

}

@Override

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

//该方法处理https请求

handler.proceed(); //表示等待证书响应

// handler.cancel(); //表示挂起连接,为默认方式

// handler.handleMessage(null); //可做其他处理

}

//

@Nullable

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

//请求中携带Authorization的关键二

Log.i("myweb", "请求资源 " + request.getUrl());

WebResourceRequest request1 = new WebResourceRequest() {

@Override

public Uri getUrl() {

return request.getUrl();

}

@Override

public boolean isForMainFrame() {

return request.isForMainFrame();

}

@Override

public boolean isRedirect() {

return request.isRedirect();

}

@Override

public boolean hasGesture() {

return request.hasGesture();

}

@Override

public String getMethod() {

return request.getMethod();

}

@Override

public Map getRequestHeaders() {

Map Headers = request.getRequestHeaders();

String bearer = "Bearer " + httpConfig.access_token;

Headers.put("Authorization", bearer);

return Headers;

}

};

for (Map.Entry entry : request1.getRequestHeaders().entrySet()) {

Log.w("myweb", entry.getKey() + ":" + entry.getValue());

}

//请求携带Cookie的关键代码

CookieSyncManager.createInstance(TransactionDetailActivity.this);

CookieManager cookieManager = CookieManager.getInstance();

cookieManager.setAcceptCookie(true);

cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);

CookieSyncManager.getInstance().sync();

return super.shouldInterceptRequest(view, request1);

}

});

webview.setWebChromeClient(new WebChromeClient() {

//获取网站标题

@Override

public void onReceivedTitle(WebView view, String title) {

Log.i("myweb", "标题:" + title);

}

//获取加载进度

@Override

public void onProgressChanged(WebView view, int newProgress) {

if (newProgress < 100) {

String progress = newProgress + "%";

System.out.println(progress);

} else if (newProgress == 100) {

String progress = newProgress + "%";

System.out.println(progress);

}

}

});

}

关键代码:设置拦截连接中的Authorization、Cookie

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

//请求中携带Authorization的关键二

Log.i("myweb", "请求资源 " + request.getUrl());

WebResourceRequest request1 = new WebResourceRequest() {

@Override

public Uri getUrl() {

return request.getUrl();

}

@Override

public boolean isForMainFrame() {

return request.isForMainFrame();

}

@Override

public boolean isRedirect() {

return request.isRedirect();

}

@Override

public boolean hasGesture() {

return request.hasGesture();

}

@Override

public String getMethod() {

return request.getMethod();

}

@Override

public Map getRequestHeaders() {

Map Headers = request.getRequestHeaders();

String bearer = "Bearer " + httpConfig.access_token;

Headers.put("Authorization", bearer);

return Headers;

}

};

for (Map.Entry entry : request1.getRequestHeaders().entrySet()) {

Log.w("myweb", entry.getKey() + ":" + entry.getValue());

}

//请求携带Cookie的关键代码

CookieSyncManager.createInstance(TransactionDetailActivity.this);

CookieManager cookieManager = CookieManager.getInstance();

cookieManager.setAcceptCookie(true);

cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);

CookieSyncManager.getInstance().sync();

return super.shouldInterceptRequest(view, request1);

}

});

使用

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initWebView();

String bearer = "Bearer " + httpConfig.access_token;

Map headerMap = new HashMap();

headerMap.put("Authorization", bearer);

String param = getIntent().getStringExtra("param");

String URL = "http://" + api.DomainName + "/oct/oct_apply?" + param;

webview.loadUrl(URL, headerMap);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

if (webview != null) {

webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);

webview.clearHistory();

webview.clearCache(true);

((ViewGroup) webview.getParent()).removeView(webview);

webview.destroy();

webview = null;

}

super.onDestroy();

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

if (webview != null) {

webview.getSettings().setJavaScriptEnabled(true);

webview.reload();

}

}

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

if (webview != null)

webview.getSettings().setJavaScriptEnabled(false);

}

@Override

protected void onStart() {

super.onStart();

}

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: