Android Okhttp实现注册登陆等功能,使用https

先记录下大概流程php

一、使用Okhttp发送post请求到服务端完成注册登陆html

二、添加https,实现https请求java

三、遇到的问题:post请求屡次发送形成后端数据不在同一session,解决:OkHttpClient建立时,传入这个CookieJar的实现,就能完成对Cookie的自动管理android

     下面是 RequestManager 类代码:后端

package com.okhttpclient;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import static com.okhttpclient.MainActivity.handler;

/**
* Created by seceinfofs on 2016/11/28.
*/

public class RequestManager {

public static final String BASE_URL = "http://192.168.1.200/RayvanWebAuth.php";//根地址

public static final String REGISTER_URL = "register";//注册地址
public static final String LOGIN_URL = "login";//登陆地址
public static final String LOGOUT_URL = "logout";//退出地址
public static final String AUTHCODE = "getAuthCode";//获取验证码


private static volatile RequestManager mInstance;//单利引用
private OkHttpClient mOkHttpClient;//okHttpClient 实例
public Handler okHttpHandler;//全局处理子线程和M主线程通讯
private Context context;


/**
* 初始化RequestManager
*/
public RequestManager(Context context) {


//初始化OkHttpClient
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间
.cookieJar(new CookieJar() {//OkHttpClient建立时,传入这个CookieJar的实现,就能完成对Cookie的自动管理
private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url, cookies);
}

@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url);
return cookies != null ? cookies : new ArrayList<Cookie>();
}
})
.sslSocketFactory(getSSLSocketFactory(context, "cert.pem"))//添加https
.build();

//初始化Handler
okHttpHandler = new Handler(context.getMainLooper());
this.context = context;
}

/**
* 获取单例引用
*/

public static RequestManager getInstance(Context context) {
RequestManager inst = mInstance;
if (inst == null) {
synchronized (RequestManager.class) {
inst = mInstance;
if (inst == null) {
inst = new RequestManager(context.getApplicationContext());
mInstance = inst;
}
}
}
return inst;
}



//实现https的类
private static SSLSocketFactory getSSLSocketFactory(Context context,String name) {
        if (context == null) {            throw new NullPointerException("context == null");        }        //CertificateFactory用来证书生成        CertificateFactory certificateFactory;        InputStream inputStream = null;        Certificate certificate;        try {            inputStream = context.getResources().getAssets().open(name);        } catch (IOException e) {            e.printStackTrace();        }        try {            certificateFactory = CertificateFactory.getInstance("X.509");            certificate = certificateFactory.generateCertificate(inputStream);            //Create a KeyStore containing our trusted CAs            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());            keyStore.load(null, null);            keyStore.setCertificateEntry(name,certificate);            //Create a TrustManager that trusts the CAs in our keyStore            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());            trustManagerFactory.init(keyStore);            //Create an SSLContext that uses our TrustManager            SSLContext sslContext = SSLContext.getInstance("TLS");            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());            return sslContext.getSocketFactory();        } catch (Exception e) {        }        return null;    }    /**     * 同步Post请求     * @param action     * @param name     * @param password     */    public int requestPostBySyn(String action,String name,String password,String authCode) {        int rc = -1;        final String requestUrl = String.format("%s", BASE_URL);        RequestBody formBody = null;        if(action.equals(AUTHCODE)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("sendNumber", name)                    .build();        } else if(action.equals(REGISTER_URL)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("username", name)                    .add("password", password)                    .add("authCode",authCode)                    .build();        }else if(action.equals(LOGIN_URL)){            password = SHA256.Encrypt(password, "");            formBody = new FormBody.Builder()                    .add("action",action)                    .add("username", name)                    .add("password", password)                    .build();        }else if(action.equals(LOGOUT_URL)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("uuid", name)                    .add("token", password)                    .build();        }         final Request request = new Request.Builder()                 .url(requestUrl).post(formBody).build();         Call call = mOkHttpClient.newCall(request);        try {            final Response response = call.execute();            final String result =  response.body().string();            postToMianThread(result);            rc = 0;        } catch (IOException e) {            postToMianThread(null);            e.printStackTrace();            rc = -1;        }        return rc;    }    /**     * 异步Post请求     * @param action     * @param name     * @param password     */    public void requestPostByAsyn(final String action, String name, String password, String authCode) {        final String requestUrl = String.format("%s", BASE_URL);        RequestBody formBody = null;        if(action.equals(AUTHCODE)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("sendNumber", name)                    .build();        } else if(action.equals(REGISTER_URL)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("username", name)                    .add("password", password)                    .add("authCode",authCode)                    .build();        }else if(action.equals(LOGIN_URL)){            password = SHA256.Encrypt(password, "");            formBody = new FormBody.Builder()                    .add("action",action)                    .add("username", name)                    .add("password", password)                    .build();        }else if(action.equals(LOGOUT_URL)){            formBody = new FormBody.Builder()                    .add("action",action)                    .add("uuid", name)                    .add("token", password)                    .build();        }        final Request request = new Request.Builder().url(requestUrl).post(formBody).build();        Call call = mOkHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                postToMianThread(null);            }            @Override            public void onResponse(Call call, Response response) throws IOException {                final String res = response.body().string();                if(action.equals(LOGIN_URL)){                    Message message  =new Message();                    Bundle bundle = new Bundle();                    bundle.putString("key",res);                    message.setData(bundle);                    handler.sendMessage(message);                    postToMianThread(res);                }            }        });    }    /**     * 请求响应     * @param result     */    private void postToMianThread(final String result){        okHttpHandler.post(new Runnable() {            @Override            public void run() {                if(result!=null){                    Toast.makeText(context, "..."+result, Toast.LENGTH_LONG).show();                }else {                    Toast.makeText(context, "..."+"Fail", Toast.LENGTH_LONG).show();                }            }        });    }}参考文档地址:一、http://www.cnblogs.com/whoislcj/p/5526431.html二、http://blog.csdn.net/lmj623565791/article/details/48129405三、http://www.jianshu.com/p/1fdbcfcc962c四、http://blog.csdn.net/dd864140130/article/details/52625666五、http://www.open-open.com/lib/view/open1453422314105.html六、http://www.cnblogs.com/LittleHann/p/3741907.htmlPs:这是第一次在网上写东西,主要是为了记录下来 之后忘了回头看的时候方便 一会把demo上传到网上
相关文章
相关标签/搜索