一、前言
在上一遍博文webView系列(八)----拼接参数中,我们讲到如何拼接token,拼接token的目的我们也都知道,就是为了识别用户已经登陆了,相当于网页中的cookie(也可以使用cookie,这里就不做介绍),但是虽然是拼接了token了,但是token是有过期时间的,我们怎么才能知道token过期了呢?接下来我们就开始讲解登陆验证。
二、登陆验证
/**
* api>=21调用
* @param view
* @param request
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request) {
LogUtil.e("加载顺序--》WebViewClient shouldInterceptRequest(WebView view, final WebResourceRequest request)" );
if (request != null && request.getUrl() != null && request.getMethod().equalsIgnoreCase("get")) {
String scheme = request.getUrl().getScheme().trim();
if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) {
if (request.getUrl().toString().contains(".html")) {
try {
URL url = new URL(InjectParamsUtil.verrificationToken(request.getUrl().toString()));
URLConnection connection = url.openConnection();
if (connection.getInputStream().toString().length() < 120) {
String value = IOUtils.toString(connection.getInputStream(), "UTF-8");
if (value.startsWith("{")) {
HttpResult httpResult = JSONObject.parseObject(value, HttpResult.class);
if (httpResult != null) {
if (Constants.LOGIN_OUT_CODE.equals(httpResult.getCode())) {
setResult(LOGIN_OUT_RESULT);
finish();
}
}
}
} else {
connection.getInputStream().close();
}
return null;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return null;
}
/**
* api<21调用
* @param view
* @param url
* @return
*/
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
LogUtil.e("加载顺序--》WebViewClient shouldInterceptRequest(WebView view, String url)" );
if (url.contains(".html")) {
try {
URL url1 = new URL(InjectParamsUtil.verrificationToken(url));
URLConnection connection = url1.openConnection();
if (connection.getInputStream().toString().length() < 120) {
String value = IOUtils.toString(connection.getInputStream(), "UTF-8");
if (value.startsWith("{")) {
HttpResult httpResult = JSONObject.parseObject(value, HttpResult.class);
if (httpResult != null) {
if (Constants.LOGIN_OUT_CODE.equals(httpResult.getCode())) {
setResult(LOGIN_OUT_RESULT);
finish();
}
}
}
} else {
connection.getInputStream().close();
}
return null;
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
我们前面讲过,webview在进行资源加载的时候都会调用shouldInterceptRequest()方法,既然这样,我们网页的加载其实也是一种资源加载,也会调用此方法,这时候,我们的登陆验证,就可以在此方法中进行了。
三、登陆验证主要方法
-
URL url1 = new URL(InjectParamsUtil.verrificationToken(url)); URLConnection connection = url1.openConnection();
注意方法就是这个,其他的就是剩下的验证处理了。
- InjectParamsUtil.verrificationToken(url):这个方法我们进行的是token的拼接。(可能有人会有疑问,为什么还要进行token的拼接,这里做拼接只是确保了验证的url一定带了token的参数)
- URLConnection connection = url1.openConnection():openConnection()会获取整个url的全部内容,注意是全部哦。在这里,为了防止内存溢出,我们需要需要做一些处理。
- 我们能拿到这个url的数据了,这时候只需要与h5或者后台的同事协调好,如果token失效,就返回一些判断性的字符。比如:返回一个json字符串,然后我们那到整个页面的就是整个json字符串,然后我们再对这json字符串进行解析处理就可以了。
- 获取到登陆失效的信息之后,执行我们想要的操作。(这里进行了退出登录的操作,就是回到了登录页面)
四、InjectParamsUtil类
public class InjectParamsUtil {
/**
* 注入参数
*
* @param url
* @return
*/
public static String injectIsParams(String url) {
if (url != null && !url.contains("access_token=")) {
if (url.contains("?")) {
return url + "&access_token=" + SPUtils.get(App.getInstance().getApplicationContext(), Constants.ACCESS_TOKEN, "");
} else {
return url + "?access_token=" + SPUtils.get(App.getInstance().getApplicationContext(), Constants.ACCESS_TOKEN, "");
}
} else {
String newUrl = "";
String newToken = "";
String oldToken = url.substring(url.indexOf("access_token=") + 13);
newToken = (String) SPUtils.get(App.getInstance().getApplicationContext(), Constants.ACCESS_TOKEN, "");
if (!TextUtils.isEmpty(oldToken)) {
newUrl = url.replace(oldToken, newToken);
} else {
newUrl = url;
}
return newUrl;
}
}
public static String verrificationToken(String url) {
if (url != null && !url.contains("access_token=")) {
if (url.contains("?")) {
return url + "&access_token=" + SPUtils.get(App.getInstance().getApplicationContext(), Constants.ACCESS_TOKEN, "");
} else {
return url + "?access_token=" + SPUtils.get(App.getInstance().getApplicationContext(), Constants.ACCESS_TOKEN, "");
}
}
return url;
}
}
既然能验证登陆信息了,那可能需求就会想更加优化一点了,做到无感登陆,就是在token失效后,我们进行token的刷新请求,替换掉token之后再次刷新页面。具体的请查看下一篇博文webView系列(十)----自动登录(刷新token持久化登录)