时间:2021-05-21
token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
第一种方案
通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。
第二种方案
根据和后端协商好的返回码处理刷新token步骤。代码如下;
public class TokenInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request.Builder request = chain.request().newBuilder(); //添加默认的Token请求头 request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId()); Response proceed = chain.proceed(request.build()); okhttp3.MediaType mediaType = proceed.body().contentType(); //如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感 String content = proceed.body().string(); if (isTokenExpired(content)) { String newToken = getNewToken(); UserInfo.getInstance().setPhpSessionId(newToken); //使用新的Token,创建新的请求 Request newRequest = chain.request().newBuilder() .addHeader("Cookie", newToken) .build(); return chain.proceed(newRequest); } return proceed.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build(); } private String getNewToken() { // 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求 IndexService service = IndexService.Builder.getServer(); Call<BaseObjResult<UserBean>> call = service.getToke( UserInfo.getInstance().getPhone(), UserInfo.getInstance().getPwd(), 0); //要用retrofit的同步方式 BaseObjResult<UserBean> newToken = null; try { newToken = call.execute().body(); } catch (IOException e) { e.printStackTrace(); } return newToken.getResult().getPHPSESSID(); } /** * 根据Response,判断Token是否失效 * * @return */ private boolean isTokenExpired(String resultStr) { RequestCode requestCode = new Gson().fromJson(resultStr, RequestCode.class); //err==3 token过期 if (requestCode.getErr() == 3) { LogUtils.e("Token登录过期了"); ToastUtils.showShortSafe("Token登录过期了"); return true; } return false; } class RequestCode { private int err; private String msg; public int getErr() { return err; } public void setErr(int err) { this.err = err; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }}使用方式
okBuilder.addInterceptor(new TokenInterceptor()); //请求过期更换token以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
token已过期的解决方法是: token已过期代表证书等过期的意思。需要重新获取code,然后得到access_token,即要重新调用授权界面,需要用re
以微信为例,判断token过期的方法: 1、把token放到session里; 2、如果会话过期,token也就会过期使用的时候只要判断当前会话是否有效即可
前面提到过重复提交表单问题,处理token口令校验、重定向之外,还有一种经常使用到的方法就是新页面处理表单提交,完成后关闭当前页面,并刷新之前发送请求的页面。这
Android界面刷新Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Andr
token代表证书已过期的意思。 token在互联网行业代表的是身份令牌。就是登录之后系统分发的一个代表这个用户的一个证书,这个证书是有时效的,如果时效结束了