1. HTTP 401 错误 - 未授权: (Unauthorized)
网页提示如下
您的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();
}