详解Android的登录那点事
随着互联网的高速发展,一个应用为了保护用户的隐私,通常会通过设置用户名+密码的验证方式保证用户隐私的相对安全,我知道一般网站的登录验证,通常会设置一个二维码,通过验证二维码,防止恶意软件通过机械程序,对用户密码进行破解,那么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; } }
好了结束了,内容简单,大家自行了解吧。新手学习,高手交流。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!