利用okhttp框架实现包含验证码的用户登录,保持session操作(上)

一、 这篇文章要解决什么问题,能学习到什么?

最近要做一个院务系统的项目,会把我的学习新知识的过程记录下来,本篇文章是实现登录的操作,本来以为登录的过程是一件比较简单的事情,但是深入了解过后还是有一定难度:

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/53380651

二、问:什么是session和cookie?

简单来说,cookie就是客户端的会话id,而session就是服务器端的会话id,根据这个id号可以查询到你的会话内容。

(想要了解更多cookie和session的知识可以点击这里)

http://blog.csdn.net/androidxiaogang/article/details/51925388

在本项目中用到的是验证码照片的获取,因为每次刷新验证码的url都会有不同的验证码照片出现,所以需要保存验证码的session,不然别人怎么知道你和哪个验证码进行了“会话”。先上照片:

如图分为四个步骤,结合文字更容易理解:

1. 客户端发个请求验证码照片的请求,带回来了照片和一个jsessionid的字段存在用户的cookie中。

2. 我们从cookie头中取出这个session,然后打包参数发过去的时候顺便带上这个session,让服务器这个家伙知道是谁发的。

四个步骤两点总结,在加上代码就更好理解了。

三、分析部分重要代码 最后再贴上全部代码

看一下后台那边给我们的数据有什么,有url_randCodeImage用来发送get请求获取照片,还有url_login用来post数据过去,这些就是我们要打包发送过去的数据:

还有我们的xml界面

首先是我们的验证码照片的获取与异步加载图片


  1. //发送请求获取验证码照片 
  2. private void ChangeImage() { 
  3.         Request request = new Request.Builder() 
  4.                 .url(App.url_randCodeImage) 
  5.                 .build(); 
  6.         Call call = okHttpClient.newCall(request); 
  7.         call.enqueue(new Callback() { 
  8.             @Override 
  9.             public void onFailure(Call call, IOException e) { 
  10.                 Log.i("info_callFailure",e.toString()); 
  11.             } 
  12.   
  13.             @Override 
  14.             public void onResponse(Call call, Response response) throws IOException { 
  15.                 byte[] byte_image =  response.body().bytes(); 
  16.   
  17.   
  18.                 //通过handler更新UI 
  19.                 Message message = handler.obtainMessage(); 
  20.                 message.obj = byte_image; 
  21.                 message.what = SUCCESS; 
  22.                 Log.i("info_handler","handler"); 
  23.                 handler.sendMessage(message); 
  24.   
  25.                 //获取session的操作,session放在cookie头,且取出后含有“;”,取出后为下面的 s (也就是jsesseionid) 
  26.                 Headers headers = response.headers(); 
  27.                 Log.d("info_headers", "header " + headers); 
  28.                 List<String> cookies = headers.values("Set-Cookie"); 
  29.                 String session = cookies.get(0); 
  30.                 Log.d("info_cookies", "onResponse-size: " + cookies); 
  31.   
  32.                 s = session.substring(0, session.indexOf(";")); 
  33.                 Log.i("info_s", "session is  :" + s); 
  34.   
  35.             } 
  36.         }); 
  37.     } 
  38.   
  39. //异步加载图片 
  40. public Handler handler = new Handler(){ 
  41.         @Override 
  42.         public void handleMessage(Message msg) { 
  43.             switch (msg.what){ 
  44.                 //加载网络成功进行UI的更新,处理得到的图片资源 
  45.                 case SUCCESS: 
  46.                     //通过message,拿到字节数组 
  47.                     byte[] Picture = (byte[]) msg.obj; 
  48.                     //使用BitmapFactory工厂,把字节数组转化为bitmap 
  49.                     Bitmap bitmap = BitmapFactory.decodeByteArray(Picture, 0, Picture.length); 
  50.                     //通过imageview,设置图片 
  51.                     img_identy.setImageBitmap(bitmap); 
  52.   
  53.                     break; 
  54.                 //当加载网络失败执行的逻辑代码 
  55.                 case FALL: 
  56.                     Toast.makeText(MainActivity.this, "网络出现了问题", Toast.LENGTH_SHORT).show(); 
  57.                     break; 
  58.             } 
  59.         } 
  60.     };  

获取了照片和session之后,我们就打包发送数据过去:


  1. private void LoginServer() { 
  2.         Log.i("info_Login","知道了session:"+s); 
  3.         OkHttpClient client = new OkHttpClient(); 
  4.         FormBody body = new FormBody.Builder() 
  5.                 .add("userName",et_username.getText().toString()) 
  6.                 .add("password",et_code.getText().toString()) 
  7.                 .add("randCode",et_identy.getText().toString()) 
  8.                 .add("langCode","zh-cn") 
  9.                 .build(); 
  10.         Request request = new Request.Builder() 
  11.                 .addHeader("cookie",s) 
  12.                 .url(App.url_login) 
  13.                 .post(body) 
  14.                 .build(); 
  15.         Call call2 = okHttpClient.newCall(request); 
  16.         call2.enqueue(new Callback() { 
  17.             @Override 
  18.             public void onFailure(Call call, IOException e) { 
  19.                 Log.i("info_call2fail",e.toString()); 
  20.             } 
  21.   
  22.             @Override 
  23.             public void onResponse(Call call, Response response) throws IOException { 
  24.                 if(response.isSuccessful()){ 
  25.                     Log.i("info_call2success",response.body().string()); 
  26.                 } 
  27.                 Headers headers = response.headers(); 
  28.                 Log.i("info_respons.headers",headers+""); 
  29.   
  30.             } 
  31.         }); 
  32.     }  

最后来看看我们成功登录后log出来的信息

最后贴上我们的全部代码,希望对过程不太理解的小伙伴有所帮助:

本文作者:佚名

来源:51CTO

时间: 2024-08-20 09:27:41

利用okhttp框架实现包含验证码的用户登录,保持session操作(上)的相关文章

c#-登陆之后导入CSV文件到DGV后,下次用同样的用户登录DGV上会显示上一次导入的CSV

问题描述 登陆之后导入CSV文件到DGV后,下次用同样的用户登录DGV上会显示上一次导入的CSV 这个功能应该怎么做,我不知道我导入的CSV应该怎么保存让他下一次还会显示出来,用什么东西保存?我导入csv是不经过数据库的,我想让他保留上一次用户的csv文件应该也不会用到数据库吧,我该怎么做? 解决方案 存放在用户的文档文件夹下,用固定的文件名 解决方案二: 每次都读取相同的文件名,就可以了. 解决方案三: 保存路径喽,下次判断加载 解决方案四: 如果有用到数据库,还是存数据库方便些,存本地没意义

PHP+Ajax验证码验证用户登录_php实例

用AJAX 验证用户登录的一个好处是不刷新跳转页面,外加用到验证码就更安全了,摸索的写了下.一共用到三个文件: yz.php:  生成验证码的PHP 文件,将验证码将在SESSION 里,供登录时对比调用index.php: 用户登录的HTML 文件loginCheck.php: 验证用户登录的文件 下面一一解析:yz.php 文件 <?php session_start(); //生成验证码图 Header("Content-type: image/PNG"); //长与宽 $

linux查看ssh用户登录日志与操作日志

ssh用户登录日志 linux下登录日志在下面的目录里:  代码如下 复制代码 cd /var/log 查看ssh用户的登录日志:  代码如下 复制代码 less secure 1. 日志简介 日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹.日志主要的功能有:审计和监测.他还可以实时的监测系统状态,监测和追踪侵入者等等. 在Linux系统中,有三个主要的日志子系统: 连接时间日志–由多个程序执行,把纪录写入到/v

php用户登录代码session、cookie自动记忆功能

我们先来看个最简单的实例 以下附简单的login.htm内容  代码如下 复制代码 <html> <body> <form name="login" action="login.php" method=post> 用户名<input type=text name="name"> <p>密码<input type=password name="password"&

Flask框架的学习指南之用户登录管理_python

继续flask的学习之旅.今天介绍flask的登陆管理模块,还记得上一篇中的blog小项目么,登录是咱们自己写的验证代码,大概有以下几个步骤: 1.在登录框中输入用户名和密码 2.flask view函数获取用户密码,然后到数据库中查询该用户信息,进行匹配 3.如果成功,就写入session中,重定向到首页 4.如果对于特定视图,必须要登录才能访问,那么需要在每个视图函数验证session里是否存在该用户. 今天继续改造blog项目,介绍的flask-login模块就是替我们来搞定这些业务相关度

PHP中如何使用session实现保存用户登录信息_php实例

session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦. 使用session保存页面登录信息 1.数据库连接配置页面:connectvars.php <?php //数据库的位置 define('DB_HOST', 'localhost'); //用户名 define('DB_USER', 'root'); //口令 define('DB_PASSW

php同时使用session和cookie来保存用户登录信息的实现代码_php实例

1.用户登录状态操作类UserLogin <?php final class UserLogin { public function __construct() { } public static function getUserInfo() { if (isset($_COOKIE["user_id"])&&$_COOKIE["user_id"]&&(trim($_COOKIE["user_id"])!=&

java struts2-怎样利用Java 中的struts2框架实现数据库中用户登录功能?

问题描述 怎样利用Java 中的struts2框架实现数据库中用户登录功能? 在Action中LoginAction怎样写? 配置文件中怎样写? 总体实现能够使数据库中已经存在的用户凭自己的密码与用户名登录成功呢?数据库是Oracle数据库.

SharePoint自动化部署:如何利用PowerShell 导出/导入AD中的用户

这几个月一直在帮客户改需求,部署.我已经心力憔悴,经过一段时间的摸索,我对用PowerShell实现自动化部署也有了一些心得,比如说利用PowerShell导出导入AD中的User.在基于SharePoint平台开发时,利用AD来进行人员的管理,一般会建组织单元(OrganizationalUnit)来对用户进行管理.当最终部署到客户的服务器上时,怎样把本地AD中的用户数据同步到服务器上呢,要知道如果手动输入人员是一件麻烦的事.幸运的事,PowerShell可以帮我们解决这个麻烦的问题. 导出A