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();
		
	}

  

 

    

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM