在上篇文章中学习了cookie和session,示例主要是在web中,今天学习下一些情况在android中的使用。
http://blog.csdn.net/androidxiaogang/article/details/51925388
功能:android端要实现图片验证码功能。
1、方法一:本地实现图片验证
在本地实现图片验证码:这种方式,是不与服务器验证的,验证码在android端生成,并且自已校验。
2、方法二:接收服务器验证图片,提交时服务器校验。
这种方法,我们只需要有一个接受验证码的接口,传过来的是一张验证码的图片,当登陆的时候,把图片中的数字发送给服务器,服务器在校验后,返回结果。
在这里主要介绍一下方法二的使用,并且方法二用到cookie和session的相关知识。
流程如下:
下面从示例中分析(用okhttp作网络请求,与httpurlconnection,httpclien原理一样):
1、请求验证码接口中从响应头在打印信息
Headers headers = response.headers();
Log.d(TAG, "header " + headers);
List<String> cookies = headers.values("Set-Cookie");
String session = cookies.get(0);
Log.d(TAG, "onResponse-size: " + cookies);
s = session.substring(0, session.indexOf(";"));
Log.i(TAG, "session is :" + s);
2、当验证的时候,把JSESSIONID=3BEF5AE746C8573FF6BA3CFBC6DFF632取出并添加到请求头中:
Request request = new Request.Builder()
.addHeader("cookie",session)
下面是代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText text;
// 请求图片的url
private String url = "http://xxx";
private final static String TAG = "MainActivity";
private OkHttpClient mOkHttpClient;
private ImageView image;
private Button button;
private String code;
private String s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate");
text = (EditText) findViewById(R.id.text);
image = (ImageView) findViewById(R.id.image);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
image.setOnClickListener(this);
getPicture();
}
private void getPicture() {
mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url(url)
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
//失败的回调
@Override
public void onFailure(Call call, IOException e) {
Log.i(TAG, "errro");
}
//成功的回调
@Override
public void onResponse(Call call, Response response) throws IOException {
//刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
if (response.isSuccessful()) {
InputStream is = response.body().byteStream();
Bitmap bm = BitmapFactory.decodeStream(is);
// // image.setImageBitmap(bm);
mHandler.sendEmptyMessage(0);
Message msg = new Message();
msg.obj = bm;//可以是基本类型,可以是对象,可以是List、map等;
mHandler.sendMessage(msg);
}
Headers headers = response.headers();
Log.d(TAG, "header " + headers);
List<String> cookies = headers.values("Set-Cookie");
String session = cookies.get(0);
Log.d(TAG, "onResponse-size: " + cookies);
s = session.substring(0, session.indexOf(";"));
Log.i(TAG, "session is :" + s);
}
});
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//完成主界面更新,拿到数据
Bitmap bm = (Bitmap) msg.obj;
image.setImageBitmap(bm);
break;
default:
break;
}
}
};
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
Log.i(TAG,"发这的s是: "+s);
code = text.getText().toString().trim();
String pass = Md5Utils.getMD5Str("123456");
OkHttpClient client = new OkHttpClient();
FormBody body = new FormBody.Builder()
.add("param.account", "admin")
.add("param.password", pass)
.add("param.type", "0")
.add("param.code", code)
.build();
Request request = new Request.Builder()
.addHeader("cookie",s)
//提交验证 的url;
.url("http://xxx)
.post(body)
.build();
Call call2 = mOkHttpClient.newCall(request);
//请求加入调度
call2.enqueue(new Callback() {
//失败的回调
@Override
public void onFailure(Call call, IOException e) {
Log.i(TAG, e.getMessage());
}
//成功的回调
@Override
public void onResponse(Call call, Response response) throws IOException {
//刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
if (response.isSuccessful()) {
Log.i(TAG, response.body().string());
}
Headers headers = response.headers();
Log.d(TAG, "header " + headers);
}
});
break;
case R.id.image:
getPicture();
break;
}
}
}