当前位置: 首页 > 科技观察

使用okhttp框架实现包含验证码的用户登录,并维护session操作(下)

时间:2023-03-21 12:32:41 科技观察

1.本文将解决哪些问题,可以学到什么?最近在做一个学校管理系统的项目,将我学习新知识的过程记录下来。本文是实现登录操作。本来以为登录过程是一件比较简单的事情,但是深入理解之后,还是有一定的难点:1.登录过程中获取验证码照片,使用http的get操作后,将参数传递给服务器,你需要使用post。2、上面的get和post操作用目前很多网络框架都可以实现,比如volley,但是获取验证码照片后,必须要维持一个session,所以查阅了资料,使用okhttp框架搭建这个项目比较方便的。先了解一下okhttp的使用方法:http://blog.csdn.net/itachi85/article/details/51190687快速入门使用okhttp加载图片:http://blog.csdn.net/bo543937071/article/details/533806512.问:什么是session和cookie?简单的说,cookie就是客户端的sessionid,session就是服务端的sessionid。根据这个id号,就可以查询到你的session内容了。(想了解更多关于cookies和session的可以点这里)http://blog.csdn.net/androidxiaogang/article/details/51925388本项目使用验证码照片的获取,因为每次刷新验证的urlcode会有不同的验证码图片,所以你需要保存验证码的session,不然别人怎么知道你和哪个验证码“对话”过。先上传照片:如图分为四步,结合文字更容易理解:1.客户端发送验证码照片请求,返回照片和一个jsessionid字段,存储在用户的cookie中。2、我们从cookie头中取出session,发送过来的时候把session连同打包参数一起带过去,这样服务端就知道是谁发送的了。四个步骤总结为两点,后面会加上代码,方便理解。3、分析一些重要的代码***,把所有的代码都贴出来,看看后台给我们什么数据。有url_randCodeImage发送get请求获取照片,有url_login发布数据。这些就是我们要打包发送过去的数据:而我们的xml接口首先是获取我们的验证码照片和异步加载图片//发送获取验证码照片的请求privatevoidChangeImage(){Requestrequest=newRequest.Builder().url(App.url_randCodeImage).build();Callcall=okHttpClient.newCall(request);call.enqueue(newCallback(){@OverridepublicvoidonFailure(Callcall,IOExceptione){Log.i("info_callFailure",e.toString());}@OverridepublicvoidonResponse(Callcall,Responseresponse)throwsIOException{byte[]byte_image=response.body().bytes();//通过handler更新UIMessagemessage=handler.obtainMessage();message.obj=byte_image;message.what=SUCCESS;Log??.i("info_handler","handler");handler.sendMessage(message);//获取session操作,session放在cookie头中,取出后包含";",以及后面的s(即jsesseionid)Headersheaders=response.headers();Log.d("info_headers","header"+headers);Listcookies=headers.values("Set-Cookie");Stringsession=cookies.get(0);Log.d("info_cookies","onResponse-size:"+cookies);s=session.substring(0,session.indexOf(";"));Log.i("info_s","sessionis:"+s);}});}//异步加载图片publicHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){//加载网络成功更新UI,处理得到的图片资源caseSUCCESS://通过消息获取字节数组byte[]Picture=(byte[])msg.obj;//使用BitmapFactory工厂将字节数组转换成位图Bitmapbitmap=BitmapFactory.decodeByteArray(Picture,0,Picture.length);//通过imageview设置图片img_identy.setImageBitmap(bitmap);break;//网络加载失败时执行的逻辑代码caseFALL:Toast.makeText(MainActivity.this,"有问题网络",Toast.LENGTH_SHORT).show();break;}}};拿到照片和session后,我们打包发送数据:.add("用户名",et_username.getText().toString()).add("密码",et_code.getText().toString()).add("randCode",et_identy.getText().toString()).add("langCode","zh-cn").build();Requestrequest=newRequest.Builder().addHeader("cookie",s)。url(App.url_login).post(body).build();Callcall2=okHttpClient.newCall(request);call2.enqueue(newCallback(){@OverridepublicvoidonFailure(Callcall,IOExceptione){Log.i("info_call2fail",e.toString());}@OverridepublicvoidonResponse(Callcall,Responseresponse)throwsIOException{if(response.isSuccessful()){Log.i("info_call2success",response.body().string());}Headersheaders=response.headers();Log.i("info_respons.headers",headers+"");}});}***我们登录成功后看日志信息***把我们所有的代码贴上,希望过程可以有待改进不懂的朋友帮忙:继续