zoukankan      html  css  js  c++  java
  • Android Okhttp实现注册登录等功能,使用https

    先记录下大概流程

    1、使用Okhttp发送post请求到服务端完成注册登录

    2、添加https,实现https请求

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

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

    }


    参考文档地址:
    1、http://www.cnblogs.com/whoislcj/p/5526431.html
    2、http://blog.csdn.net/lmj623565791/article/details/48129405
    3、http://www.jianshu.com/p/1fdbcfcc962c
    4、http://blog.csdn.net/dd864140130/article/details/52625666
    5、http://www.open-open.com/lib/view/open1453422314105.html
    6、http://www.cnblogs.com/LittleHann/p/3741907.html



    Ps:这是第一次在网上写东西,主要是为了记录下来 以后忘了回头看的时候方便 一会把demo上传到网上
  • 相关阅读:
    git 比较两个分支日志和文件的差异
    Interspeech 2020调研:文本前端
    centOS 7 修改分辨率、图形与命令行界面切换
    pdf表格提取camelot安装教程
    CFS任务的负载均衡——2
    CFS任务的负载均衡(框架篇)——(1)
    ftrace笔记一
    红黑树rbtree学习笔记
    一. scheduler相关结构体简介
    cpu_capacity、task_util、cpu_util计算方法
  • 原文地址:https://www.cnblogs.com/duzhq/p/6184045.html
Copyright © 2011-2022 走看看