Android WebView 添加authorization基本验证

1. HTTP 401 错误 - 未授权: (Unauthorized)

网页提示如下

Android WebView 添加authorization基本验证_第1张图片

您的Web服务器认为,客户端发送的 HTTP 数据流是正确的,但进入网址 (URL) 资源 , 需要用户身份验证 , 而相关信息 1 )尚未被提供, 或 2 )已提供但没有通过授权测试。这就是通常所知的“ HTTP 基本验证 ”。 需客户端提供的验证请求在 HTTP 协议中被定义为 WWW – 验证标头字段 (WWW-Authenticate header field) 

桌面应用程序一般把 "用户名+冒号+密码"用BASE64编码的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫HTTP基本认证(Basic Authentication)。

在Android端一般通过WebViewClient类的onReceivedHttpAuthRequest方法弹窗提示用户输入账号密码来实现

2. 原因:

因为request中没有包含Authorization header,服务器会返回一个401 Unauthozied给客户端,并且在Response的header“www-authentivate”中添加信息。当客户端把用户名密码用Base64加密后编码,放在Authorization header中发送给服务器,那么就会认证成功了。

3,解决:

@Override

            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {

Log.e("webview","onReceivedHttpAuthRequest");

                final WebView mView = view;

                final HttpAuthHandler mHandler = handler;

                final EditText usernameInput =new EditText(WebviewActivity.this);

                usernameInput.setHint("用户名");

                final EditText passwordInput =new EditText(WebviewActivity.this);

                passwordInput.setHint("密码");

                passwordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

                LinearLayout ll =new LinearLayout(WebviewActivity.this);

                ll.setOrientation(LinearLayout.VERTICAL);

                ll.addView(usernameInput);

                ll.addView(passwordInput);

                AlertDialog.Builder authDialog =new AlertDialog

.Builder(WebviewActivity.this)

.setTitle("身份验证")

.setView(ll)

.setCancelable(false)

.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

mHandler.proceed(usernameInput.getText().toString(), passwordInput.getText().toString());

                                dialog.dismiss();

                            }

})

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

dialog.dismiss();

                                mView.stopLoading();

//                                onLoadListener.onAuthCancel((WebviewActivity)mView, mTitleTextView);

                            }

});

                if(view!=null)

authDialog.show();

            }

你可能感兴趣的:(Android WebView 添加authorization基本验证)