• Android_okhttp框架实现手机验证码的注册及登录功能(服务器端与客户端的数据传输)


      前端时间打了n天游戏,旷了n篇博客,今天终于干了点正事了。。。

      1、手机验证码

      我是调用的掌淘科技免费的SMSSDK,虽然个人开发编辑不了短信模板,但也够可以了,毕竟是免费的嘛。

      调用流程:

      a、申请appkey和appsecert,下面这里有详解

      http://bbs.mob.com/forum.php?mod=viewthread&tid=8212&extra=page%3D1

      b、在项目根目录的build.gradle中添加依赖

      

       c、在使用SMSSDK模块的build.gradle中添加这个,把appKey和appSecret填成自己的就行

            

       d、无界面代码调用

      d-1、注册监听回调

    EventHandler eventHandler = new EventHandler() {
            public void afterEvent(int event, int result, Object data) {
                // afterEvent会在子线程被调用,因此如果后续有UI相关操作,需要将数据发送到UI线程
                Message msg = new Message();
                msg.arg1 = event;
                msg.arg2 = result;
                msg.obj = data;
                new Handler(Looper.getMainLooper(), new Handler.Callback() {
                    @Override
                    public boolean handleMessage(@NonNull Message msg) {
                        int event = msg.arg1;
                        int result = msg.arg2;
                        Object data = msg.obj;
                        if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
                            if (result == SMSSDK.RESULT_COMPLETE) {
                                // TODO 处理成功得到验证码的结果
                             
                                // 请注意,此时只是完成了发送验证码的请求,验证码短信还需要几秒钟之后才送达
                            } else {
                                // TODO 处理错误的结果
                                ((Throwable) data).printStackTrace();
    
                            }
                        } else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                            if (result == SMSSDK.RESULT_COMPLETE) {
                                // TODO 处理验证码验证通过的结果
                             
                            } else {
                                // TODO 处理错误的结果
                               
                                ((Throwable) data).printStackTrace();
                           
                            }
                        }
                        // TODO 其他接口的返回结果也类似,根据event判断当前数据属于哪个接口
                        return false;
                    }
                }).sendMessage(msg);
            }
        };
       
      
    SMSSDK.registerEventHandler(eventHandler);//通过这行代码注册监听回调

      d-2、申请验证码

                            SMSSDK.getVerificationCode("86", phone);
    

      d-3、提交验证

    SMSSDK.submitVerificationCode("86", phone, code);
    

      d-4、注销

    // 使用完EventHandler需注销,否则可能出现内存泄漏
        protected void onDestroy() {
            super.onDestroy();
            SMSSDK.unregisterEventHandler(eventHandler);
        } 

      2、注册&登录

        a、判断手机号是否已经注册(是否已经存在于数据库)

      注册:未注册则将数据转化为json对象通过okhttp发送至服务器

      登录:从服务器向客户端传输用户信息并存储至本地

      

      客户端:

    public class LogAndRegister{
        
        //这个函数用于判断是否已经注册,如果注册了就回传用户信息,并用sendRegRes接口将数据传输至LoginActivity
        public static boolean snetenceHaveRegist(final String phone, final sendRgRes sendRgRes){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    MediaType mediaType=MediaType.parse("text/x-markdown; charset=utf-8");
                    String request_body=phone;
                    Request request=new Request.Builder().
                            url("http://123.56.137.134/XiaoYiServer/sentenceRegd")
                            .post(RequestBody.create(mediaType,request_body)).build();
                    OkHttpClient okHttpClient=new OkHttpClient();
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            Log.d("LogAndRegister-------","phone查询请求失败");
                        }
    
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            //response.body只能调一次
                            String body=response.body().string();
                            Log.d("LogAndRegister-------",body);
                            sendRgRes.sendRgRes(body);
                        }
                    });
                }
            }).start();
            return false;
        }
        
        //这个函数用于向服务器发送用户信息,并将成功或失败信息通过sendRegSucc接口传回LoginActivity
        public static void Login(final JSONObject jsonObject, final SendRegSucc sendRegSucc){
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    MediaType mediaType=MediaType.parse("application/json; charset=utf-8");
                    Request request=new Request.Builder()
                            .url("http://123.56.137.134/XiaoYiServer/Regis")
                            .post(RequestBody.create(mediaType,jsonObject.toJSONString())).build();
                    OkHttpClient okHttpClient=new OkHttpClient();
    
                    Call call=okHttpClient.newCall(request);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            sendRegSucc.sendRegSucc(false);
                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            sendRegSucc.sendRegSucc(true);
                        }
                    });
                }
            }).start();
        }
        public interface sendRgRes{
            public void sendRgRes(String body);
        }
        public interface SendRegSucc{
            public void sendRegSucc(boolean succ);
        }
    }
    

      

      服务器端:

    //将用户信息存储至数据库
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		InputStream is=request.getInputStream();
    		InputStreamReader ir=new InputStreamReader(is);
    		BufferedReader br=new BufferedReader(ir);
    		StringBuffer sb=new StringBuffer();
    		String s="";
    		while((s=br.readLine())!=null) {
    			sb.append(s);
    		}
    		br.close();
    		ir.close();
    		is.close();
    		JSONObject jsonObject=JSON.parseObject(sb.toString());
    		try {
    			Connection con=DBUtil.lin("XiaoYi");
    			Statement stmt=con.createStatement();
    			String sql="insert into user values(((select max(id) form user)+1),'"+jsonObject.getString("username")+"','"
    			+jsonObject.getString("phone")+"',null,null)";
    			stmt.executeUpdate(sql);
    			stmt.close();
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		response.getWriter().print(true);
    		response.getWriter().close();
    	}
    

      

    //判断手机号是否注册,读取用户数据
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		InputStream is=request.getInputStream();
    		InputStreamReader ir=new InputStreamReader(is);
    		BufferedReader br=new BufferedReader(ir);
    		UserBean user=new UserBean();
    		String s="";
    		StringBuffer sb=new StringBuffer();
    		Boolean isIn=false;
    		while((s=br.readLine())!=null) {
    			sb.append(s);
    		}
    		System.out.println(sb.toString());
    		try {
    			Connection con=DBUtil.lin("XiaoYi");
    			java.sql.Statement stmt=con.createStatement();
    			ResultSet rsst=stmt.executeQuery("select * from user where phone='"+sb.toString()+"'");
    			if(rsst.next()) {
    				isIn=true;
    			}
    		
    			user.setId(rsst.getInt("id"));
    			user.setUsername(rsst.getString("username"));
    			user.setHead(rsst.getString("head"));
    			user.setPhone(rsst.getString("phone"));
    			user.setSex(rsst.getString("sex"));
    			rsst.close();
    			stmt.close();
    			con.close();
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		JSONObject jsonObject=JSONObject.parseObject(JSON.toJSONString(user));
    		br.close();
    		ir.close();
    		is.close();
    		if(isIn) {
    		response.getWriter().print(isIn);
    		}
    		else {
    			System.out.println(jsonObject.toJSONString());
    			response.getWriter().print(jsonObject.toJSONString());
    		}
    		response.getWriter().close();
    		
    	}
    

      

        

      

      

      

  • 相关阅读:
    【TJOI2015】弦论 (后缀数组)
    再见,高中;你好,大学
    我亲爱的朋友们
    将容斥系数隐含在式子中的方法
    一个奇妙的斯特林数推导
    CSP2019游记
    CSP2019初赛游记
    NOI2019游记
    老年选手康复训练
    CTS/APIO2019 游记
  • 原文地址:https://www.cnblogs.com/XiaoGao128/p/12720042.html
Copyright © 2020-2023  润新知