android session的使用(图片验证码)

在上篇文章中学习了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;
        }

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值