webView系列(九)----登录验证

一、前言

在上一遍博文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持久化登录)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值