android-cn / android-discuss

Android 问题交流讨论坛, 微信公众号:codekk, 网站:
https://github.com/android-cn/android-discuss/issues
Apache License 2.0
4.08k stars 537 forks source link

客户端中,如果 token过期了,大家是怎么做的?在请求接口返回的时候 判断?直接跳转登录页面?有没有比较好的实现方案 #443

Open Reallym404 opened 8 years ago

biaomingzhong commented 8 years ago

这个问题我也比较好奇,暂时是判断接口返回固定的错误状态码,然后通过FLAG_ACTIVITY_CLEAR_TASK,进入登录页面

Reallym404 commented 8 years ago

@biaomingzhong 在接口类中传入 上下位对象,然后再每个请求方法的返回中判断 token过期的错误码,相应操作后直接跳转到登陆页面?

Reallym404 commented 8 years ago

大家都是这样解决的么? 有比较完美的解决方案么,

atearsan commented 8 years ago

@yeming1001 按照你的疑惑,弹出一个登录的Dialog比较合适,这样不跳到新页面,不会打断当前用户的操作。

Reallym404 commented 8 years ago

@atearsan 这样的话 是和我上面说的那种方式一样嘛,只是你说的是 弹个dialog。。其实也是 每个请求方法返回的地方 都要做判断咯?

biaomingzhong commented 8 years ago

@yeming1001 对于的你的请求response做公共处理,就是每个请求都经过这个公共处理,公共处理的地方判断到token过期就行,不需要每个请求

AlphaHans commented 8 years ago

使用OkHttp拦截器,可以优雅解决。 参考我这篇:http://www.hanszone.xyz/2016/03/30/%E3%80%90%E9%A1%B9%E7%9B%AE%E9%87%8D%E6%9E%84%E3%80%91%E4%BD%BF%E7%94%A8OkHttp%E8%A7%A3%E5%86%B3Session%E8%BF%87%E6%9C%9F%E5%AF%BC%E8%87%B4%E7%94%A8%E6%88%B7%E6%8E%89%E7%BA%BF%E7%9A%84%E9%97%AE%E9%A2%98/

有别的问题可以和我交流一下哈~~

Reallym404 commented 8 years ago

@AlphaHans 个人最近在看 retrofit 和 rxjava,了解的还比较浅显。项目中没有使用okhttp联网操作。。。。哎。

Reallym404 commented 8 years ago

@AlphaHans 学习rxjava遇到问题 可以请教你不。这几天看了下,感觉有点没懂。怎么才能更容易上手呢。

AlphaHans commented 8 years ago

@yeming1001 建议先看OkHttp 看得差不多再去看 RxJava最后看Retrofit。 一次性学太多的库,百害无益哦。 还是一个一个 好好看~

AlphaHans commented 8 years ago

@yeming1001 RxJava推荐看例子来学。 网上的理论都是太虚了。实战理解最要紧。 推荐看一下rengwuxian大神的一个RxJavaDemo @rengwuxian

hss01248 commented 8 years ago

这个可以在刚拿到response数据的时候就直接拦截,比如上面同学说的okhttp拦截器就是这样做的; 也可以在自己封装的那一层进行处理: 比如,我项目中用的是volley,自己基于项目实际而在volley之上再简单封装了一下, 在发送一个请求获取到response传递到我自己的listener中时,判断是否为token/session过期,如果是,调用自己封装好的自动登陆的方法(需要带有回调),登陆成功后,再次发送原先的请求。

` private void postRequest(final String urlTail, final String tag, final Map map, final MyNetListener myListener){ String url = Url.HTTP_API_HEAD + Url.MID+ urlTail; map.put(Constant.PostConfig.SESSION_ID, UIUtils.getSessionId());//每一个请求都传递sessionid NormalPostRequest request = new NormalPostRequest(url, new Response.Listener() { @Override public void onResponse(JSONObject response) { if (response.optBoolean("success")){ myListener.onSuccess(response,response.toString()); }else { String msg = response.optString("message");

                if (!TextUtils.isEmpty(msg) && msg.contains("需要登录")){
                    //判断是否session过期:没有定义好code,只能通过message来判断了,坑爹
                    ApiTools.autoLogin(new MyNetListener() {
                        @Override
                        public void onSuccess(Object response, String optStr) {
                            postNewRequest(urlTail,tag,map,myListener);
                            ToastUtils.showDebugToast("重新登陆后,重新发送请求中。。。");
                        }
                    });
                }else {
                    ToastUtils.showToast(msg);
                }
                myListener.onError(msg);
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            myListener.onError(error.toString());
        }
    }, map);
    Logger.e("url:"+url);
    StringUtils.printMap(map);
    request.setTag(tag);
    request.setRetryPolicy(policy);
    requestQueue.add(request);
}`
atearsan commented 8 years ago

还有一个方式 (如果允许一个账号多出登录) 保存用户的登录账号和密码, token过期的时候直接发送登录请求, 然后把新的token保存下来.

JSONGKING commented 3 years ago

@hss01248 刷新token后如何重新发送上一次的网络请求呢 我这边接口鉴权失败并未走HTTP 401 而是 走的onsucces 通过json总的code区分的,导致我不知道该如何使用retry