Android携带token登陆验证与刷新token

最近做了一个项目其中有涉及通过token登陆验证的要求,为了加深印象,也为了有这方面需求的童鞋有个参考于是决定回头回顾一下这个过程
1、首先登陆页面通过先请求一个验证码,请求成功后通过返回体里面截取token供以后请求使用。

 OkHttpClient client = new OkHttpClient();
        //使用Gson将对象转换为json字符串
        String json = new Gson().toJson(loginDataBean);
        //MediaType  设置Content-Type 标头中包含的媒体类型值
        RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8")
                , json);
        Request request = new Request.Builder()
                .addHeader("cookie", strCookie)
                //提交验证  的url;
                .url(Config.GET_PSW_TOKEN_URL)
                .post(requestBody)
                .build();
        Call handleCode = client.newCall(request);
 /**
     * 请求验证码接口,返回cookie
     */
    private void getPicture() {
        mOkHttpClient = new OkHttpClient();
        //创建一个Request
        final Request request = new Request.Builder()
                .url(Config.GET_LOGIN_VALID_CODE)
                .build();
        //new call
        Call call = mOkHttpClient.newCall(request);
        //请求加入调度
        call.enqueue(new Callback() {
            //失败的回调
            @Override
            public void onFailure(Call call, IOException e) {
                Logger.e("errro");
            }

            //成功的回调
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
                if (response.isSuccessful()) {
                    InputStream is = response.body().byteStream();
                    Bitmap bm = BitmapFactory.decodeStream(is);
                    mHandler.obtainMessage(0, bm).sendToTarget();
                }
                Headers headers = response.headers();
                List<String> cookies = headers.values("Set-Cookie");
                String session = cookies.get(0);
                strCookie = session.substring(0, session.indexOf(";"));
            }
        });
    }

2、而后通过携带账号密码和验证码参数一同请求登陆接口(通过okhttp3的网络框架,使用post提交json格式参数)

//请求加入调度
        handleCode.enqueue(new Callback() {
            //失败的回调
            @Override
            public void onFailure(Call call, IOException e) {
                Logger.e("error" + e.getMessage());
            }

            //成功的回调
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
                if (response.isSuccessful()) {
                    //解析请求password接口后,的请求体中的token数据
                    String responseResult = response.body().string();
                    java.lang.reflect.Type type = new TypeToken<LoginResponseData>() {
                    }.getType();
                    LoginResponseData loginResponseDara = new Gson().fromJson(responseResult, type);
//进行从接口返回数据中的accessToken值进行base解码
                    SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), "ACCESS_TOKEN", loginResponseDara.getAccess_token());
                    SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(),
                            GlobalConstants.SP_SAVE_REFRESH_TOKEN, loginResponseDara.getRefresh_token());
                    String[] accessToken = loginResponseDara.getAccess_token().split("\\.");
                    String decodeToken = Base64Utils.decode(accessToken[1]);
//                            Logger.e(decodeToken);
//进行Base64解码后的json的解析,得到userName请求登录接口
                    java.lang.reflect.Type base64Type = new TypeToken<Base64DecodeBean>() {
                    }.getType();
                    Base64DecodeBean base64DecodeBean = new Gson().fromJson(decodeToken, base64Type);
                    SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), GlobalConstants.SP_SAVE_TOKEN_USERNAME,
                            base64DecodeBean.getUser_name());
//                    SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), GlobalConstants.SP_SAVE_HAVE_LOGINED,
//                            "1");//记录已经登陆过
                    LoginRequestUtil.doUserIdGet(base64DecodeBean.getUser_name());
                    getAccountId(mContext);
                } else {//验证码输入有误
                    String errorResponse = response.body().string();
                    java.lang.reflect.Type type = new TypeToken<LoginErrorResponseBean>() {
                    }.getType();
                    LoginErrorResponseBean loginResponseDara = new Gson().fromJson(errorResponse, type);
                    mHandler.obtainMessage(1, loginResponseDara.getMessage()).sendToTarget();
                }
            }
        });

说明:携带token使用post方法请求登陆,返回结果中取accessToken字段截取第二段,使用base64反解码得到userName字段请求用户数据<此处只是保存用户必要数据>,然后得到accountId字段后续使用

总结:以上就是整个请求的过程,整理的急希望以后有时间再完善一下,也希望同僚相互学习。喜欢的觉得有用的可以点一下喜欢,支持一下,嘻嘻

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容