当前位置: 移动技术网 > 移动技术>移动开发>Android > 详解Android的登录那点事

详解Android的登录那点事

2019年07月24日  | 移动技术网移动技术  | 我要评论

随着互联网的高速发展,一个应用为了保护用户的隐私,通常会通过设置用户名+密码的验证方式保证用户隐私的相对安全,我知道一般网站的登录验证,通常会设置一个二维码,通过验证二维码,防止恶意软件通过机械程序,对用户密码进行破解,那么android设备如何实现这个功能呢?相信很多开发者对此不屑一顾,因为这样增加了用户使用的复杂性,很多软件是不会这样设计的,现在我们暂且不谈它是不是有用,今天我们重点探讨一下,如何在android的设备上实现这个功能。本篇为大家介绍的内容包括:1、用户连续多次输错密码,增加验证码验证;2、android如何通过http请求达到与服务器之间的通讯。好了下面开始我们今天内容的介绍,首先我们先一起来学习一下如何实现用户连续多次输错密码,增加验证码功能。

既然用的到二维码,那么android如何生成二维码呢?为大家提供一个生成二维码的类:

//生成二维码的类
public class bputil {
 /**
  * 用于生成二维码的字符
  */
 private static final char[] chars = {
  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  'a','b','c','d','e','f','g','h','i','j','k','m','l','n','o','p','q','r','s','t','u','v','w','x','y','z',
  'a','b','c','d','e','f','g','h','i','j','k','m','l','n','o','p','q','r','s','t','u','v','w','x','y','z'
 };
 private static bputil bputil;
 public static bputil getinstance() {
  if(bputil == null)
   bputil = new bputil();
  return bputil;
 }
//   width="60" height="30" 
//    base_padding_left="5"
//   range_padding_left="10"
//   base_padding_top="15"
//   range_padding_top="10"
//   codelength="4"
//   line_number="3"
//   font_size="20"
 //default settings
 private static final int default_code_length = 4;
 private static final int default_font_size = 20;
 private static final int default_line_number = 3;
 private static final int base_padding_left = 5, range_padding_left = 10, base_padding_top = 15, range_padding_top = 10;
 private static final int default_width = 60, default_height = 30;
 //settings decided by the layout xml
 //canvas width and height
 private int width = default_width, height = default_height; 
 //random word space and pading_top
 private int base_padding_left = base_padding_left, range_padding_left = range_padding_left, 
   base_padding_top = base_padding_top, range_padding_top = range_padding_top;
 //number of chars, lines; font size
 private int codelength = default_code_length, line_number = default_line_number, font_size = default_font_size;
 //variables
 private string code;
 private int padding_left, padding_top;
 private random random = new random();
 public bitmap createbitmap() {
  padding_left = 0;
  bitmap bp = bitmap.createbitmap(width, height, config.argb_8888); 
  canvas c = new canvas(bp);
  code = createcode();
  c.drawcolor(color.white);
  paint paint = new paint();
  paint.settextsize(font_size);
  for (int i = 0; i < code.length(); i++) {
   randomtextstyle(paint);
   randompadding();
   c.drawtext(code.charat(i) + "", padding_left, padding_top, paint);
  }
  for (int i = 0; i < line_number; i++) {
   drawline(c, paint);
  }
  c.save( canvas.all_save_flag );//保存 
  c.restore();//
  return bp;
 }
 public string getcode() {
   return bputil.createcode();
 }
 private string createcode() {
  stringbuilder buffer = new stringbuilder();
  for (int i = 0; i < codelength; i++) {
   buffer.append(chars[random.nextint(chars.length)]);
  }
  return buffer.tostring();
 }
 private void drawline(canvas canvas, paint paint) {
  int color = randomcolor();
  int startx = random.nextint(width);
  int starty = random.nextint(height);
  int stopx = random.nextint(width);
  int stopy = random.nextint(height);
  paint.setstrokewidth(1);
  paint.setcolor(color);
  canvas.drawline(startx, starty, stopx, stopy, paint);
 }
 private int randomcolor() {
  return randomcolor(1);
 }
 private int randomcolor(int rate) {
  int red = random.nextint(256) / rate;
  int green = random.nextint(256) / rate;
  int blue = random.nextint(256) / rate;
  return color.rgb(red, green, blue);
 }
 private void randomtextstyle(paint paint) {
  int color = randomcolor();
  paint.setcolor(color);
  paint.setfakeboldtext(random.nextboolean()); //true为粗体,false为非粗体
  float skewx = random.nextint(11) / 10;
  skewx = random.nextboolean() ? skewx : -skewx;
  paint.settextskewx(skewx); //float类型参数,负数表示右斜,整数左斜
//  paint.setunderlinetext(true); //true为下划线,false为非下划
//  paint.setstrikethrutext(true); //true为删除线,false为非删除
 }
 private void randompadding() {
  padding_left += base_padding_left + random.nextint(range_padding_left);
  padding_top = base_padding_top + random.nextint(range_padding_top);
 }
}

有了二维码,下面我们开始设计我们的功能,这里先简单说一下,我们最终要实现的功能:1、用户正常输入用户名+密码登录;2、当用户连续3次输错密码,要求用户之后必须增加验证码输入验证。下面我们开始功能设计实现,首先是我们的布局文件:

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="${relativepackage}.${activityclass}" 
 android:orientation="vertical"
 >
 <linearlayout 
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  >
 <textview
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:text="@string/yanzheng" />
 <linearlayout 
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" 
  >
   <textview
   android:layout_weight="1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/name" />
   <edittext 
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_weight="6"
    android:layout_height="wrap_content"
    android:hint="@string/name_new"
    android:singleline="true"
    />
  </linearlayout>
  <linearlayout 
  android:orientation="horizontal"
   android:layout_width="fill_parent"
  android:layout_height="wrap_content" 
  >
   <textview
   android:layout_weight="1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/password" />
   <edittext 
    android:id="@+id/pass"
    android:layout_weight="6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="@string/pass_new"
    android:singleline="true"
    />
  </linearlayout>
  <linearlayout 
  android:id="@+id/layout_yanzhengma"
  android:visibility="gone"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" 
  >
   <textview
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/yanzhengma" />
   <textview
    android:id="@+id/rander"
   android:layout_weight="1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   />
   <edittext
    android:id="@+id/rander_input"
    android:layout_weight="1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleline="true"
    />
  </linearlayout>
  <linearlayout 
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" 
  >
   <button
   android:id="@+id/get"
   android:layout_weight="1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/get" />
   <button
     android:id="@+id/post"
   android:layout_weight="1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/post" />
  </linearlayout>
  </linearlayout>
</relativelayout>

重点的内容来了,我们主activity代码,大家先看一下吧:

public class mainactivity extends activity {
 private textview mytext = null;
 private edittext myname = null;//用户名
 private edittext mypass = null;//密码
 private edittext myrander = null;//验证码
 private button mygetbutton = null;//get方式发送http请求
 private button mypostbutton = null;//post方式发送http请求
 private linearlayout myline = null;//控制二维码的显示
 private static int n = 0;//用户输错密码次数统计
 static string name = null;//用户输入的用户名
 static string password = null;//用户输入的密码
 private string edit;//用户输入用户输入的验证码
 private string code;//验证码
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  mytext = (textview)findviewbyid(r.id.rander);
  myname = (edittext)findviewbyid(r.id.name);
  mypass = (edittext)findviewbyid(r.id.pass);
  myrander = (edittext)findviewbyid(r.id.rander_input);
  mygetbutton = (button)findviewbyid(r.id.get);
  mypostbutton = (button)findviewbyid(r.id.post);
  myline = (linearlayout)findviewbyid(r.id.layout_yanzhengma);
  mygetbutton.setonclicklistener(new mygetbutton());
  mypostbutton.setonclicklistener(new mypostbutton());

 } 
 class mygetbutton implements onclicklistener{
  public void onclick(view v) {
   name = myname.gettext().tostring();
   password = mypass.gettext().tostring();
   if(n>=3){//连续三次输错密码
    edit = myrander.gettext().tostring();
    boolean boo = captcha (code , edit);
    if(boo){
     new thread(new runnable() {
      public void run() {
       final boolean flag = sendserver.getsave(name, password);
       runonuithread(new runnable() {
        public void run() {
         if(flag){
  toast.maketext(mainactivity.this, "登录成功", toast.length_short).show();
          n=0;
         }else{
 toast.maketext(mainactivity.this, "登录失败", toast.length_short).show();
          n++;
          if(n>=3){
  myline.setvisibility(view.visible);
          }
         }
        }
       });
      }
     }).start();
    }else{
     code = bputil.getinstance().getcode().tolowercase();//生成新的二维码
     mytext.settext(code);//展示在用户面前
    }
   }else{
    new thread(new runnable() {
     public void run() {
      final boolean flag = sendserver.getsave(name, password);
      runonuithread(new runnable() {
       public void run() {
        if(flag){
         toast.maketext(mainactivity.this, "登录成功", toast.length_short).show();
         n=0;
        }else{
         toast.maketext(mainactivity.this, "登录失败", toast.length_short).show();
         n++;
         if(n>=3){
 myline.setvisibility(1);
          code = bputil.getinstance().getcode().tolowercase();
     mytext.settext(code);
         }
        }
       }
      });
     }
    }).start();
   }
  }
 }
 class mypostbutton implements onclicklistener{
  public void onclick(view v) {
   name = myname.gettext().tostring();
   password = mypass.gettext().tostring();
   new thread(new runnable() {
    public void run() {
     final boolean flag = sendserver.postsave(name, password);
     runonuithread(new runnable() {
      @override
      public void run() {
       if(flag){
        toast.maketext(mainactivity.this, "登录成功", toast.length_short).show();
        n=0;
       }else{
        toast.maketext(mainactivity.this, "登录失败", toast.length_short).show();
        n++;
        if(n>=3){
    myline.setvisibility(1);
        }
       }
      }
     });
    }
   }).start();
  }
 }
 @suppresslint("showtoast")
 private boolean captcha (string code , string edit) {
  boolean flag = false; 
  if (code.equals(edit)) {
   flag = true;
  }else {
   flag = false;
   toast.maketext(mainactivity.this, " 验证码错误", 0).show();
//   imageview.setimagebitmap(bitmap);
  }
  return flag;
 }
 protected void onrestart() {
  super.onrestart();
  n=0;
 }
 protected void ondestroy() {
  super.ondestroy();
  n=0;
 }
}

在这里简单介绍一下代码,因为本篇接下来要为大家分享关于android发送get、post请求的知识,这里我写了两个按钮,一个用来通过使用get方式验证,一个通过使用post方式验证,功能上是一致的。最后请大家注意一下:红色字体部分,红色字体部分就是我们通过调用上部二维码生成类,生成二维码,然后展示在用户界面。还有就是:onrestart、ondestroy都是activity的生命周期函数,这里将n归零,方便我们的再次登录体验。好了到这里我们的第一部分就完成了,下面我们开始进入我们本篇的下半部分。

关于android服务器请求,一般有两种方式:get、post两种方式,接下来我们就开始一起学习吧。

public class sendserver {
 //get方式请求
 public static boolean getsave(string name, string password) {
  boolean flag = false;
  httpurlconnection conn = null;
  try {
   //防止中文乱码
   string username = urlencoder.encode(name, "utf-8");
   string userpassword = urlencoder.encode(password, "utf-8");
   url url = new url("http://10.20.90.3:8080/register/manageservlet?"+"name="+username+"&password="+userpassword);
   conn = (httpurlconnection) url.openconnection();
   conn.setrequestmethod("get");
   conn.setconnecttimeout(5000);
   conn.setreadtimeout(5000);
   int responsecode = conn.getresponsecode();
   if(responsecode == 200){
    inputstream is = conn.getinputstream();
    string stu = getstringfrominputstream(is);
    if(stu.equals("登录成功")){
     flag = true;
    }
   }
  } catch (malformedurlexception e) {
   e.printstacktrace();
  } catch (exception e) {
   e.printstacktrace();
  } finally{
   if(conn != null){
    conn.disconnect(); //关闭连接
   }
  }
  return flag;
 }
 //post请求
 public static boolean postsave(string name, string password) {
  boolean flag = false;
  httpurlconnection conn = null;
  try {
   url url = new url("http://10.20.90.3:8080/register/manageservlet?");
   conn = (httpurlconnection) url.openconnection();
   conn.setrequestmethod("post");
   conn.setconnecttimeout(5000);
   conn.setreadtimeout(5000);
   //post请求参数
   string data = "name="+name+"&password="+password;
   outputstream out = conn.getoutputstream();
   out.write(data.getbytes());
   out.flush();
   out.close();
//   conn.setrequestproperty("content-length", 500);// 内容长度设置为500;请求头消息格式设置
   int respon = conn.getresponsecode();
   if(respon == 200){
    inputstream is = conn.getinputstream();
    string stu = getstringfrominputstream(is);
    if(stu.equals("登录成功")){
     flag = true;
    }
   }
  } catch (exception e) {
   e.printstacktrace();
  }finally{
   if(conn != null){
    conn.disconnect();
   }
  }
  return flag;
 }
 //解析服务返回的请求
 private static string getstringfrominputstream(inputstream is) throws exception{
  bytearrayoutputstream baos = new bytearrayoutputstream();
  byte[] buffer = new byte[1024*8];
  int len = -1;
  while((len = is.read(buffer)) != -1){
   baos.write(buffer, 0, len);
  }
  is.close();
  string html = new string(baos.tobytearray(), "gbk");//接收服务器端的数据时,防止出现中文乱码。

  //string html = baos.tostring();
  baos.close();
  return html;
 }
}

好了结束了,内容简单,大家自行了解吧。新手学习,高手交流。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网