Android会话保持实现,包括webview会话保持,多个后端session的会话保持

本文介绍了Android端会话保持的重要性及原理,并详细讲解了手动实现Android会话保持、通过okhttp框架实现、Webview会话保持以及处理多个后端session的策略,包括关键步骤和注意事项,旨在帮助开发者解决实际问题。
摘要由CSDN通过智能技术生成

转载请注明出处:http://blog.csdn.net/u011457774/article/details/78904668

一、概述

这是我的第一篇博客,一直想写,但是不知道写些什么,主要是好多都可以百度到。最近遇到个比较麻烦的问题,麻烦不是因为难,而是不好排查问题,主要是这个知识点需要对后端开发有一定的了解,不然不好排查,还好我以前在学校做过java的后端开发,不然我也不知道怎么下手。所以决定写篇博客,记录下。本文主要介绍的有三点,Android端会话保持的实现,webview的会话保持,多个后端session的会话保持,可能篇幅有点长。最近项目里用到了会话保持技术,虽然不是什么难题,但是因为之前没接触过类似的,所以也踩了不少坑,期间,没有各种百度,谷歌过,但是没有找到一个比较满意的答案。当时的一个现象是,app中webview不能正常打开,请求其它接口,不能正确的返回请求的响应,最懵逼的是,同样的webview和接口,IOS都能正常访问,因为IOS的底层会自动实现会话保持,只有我们Android端不能正常访问,我当时都懵逼了,后台的同事也懵逼了。 经过自己的各种摸索,最终还是解决了问题,现在总结一下踩过的坑,算是学习笔记吧,也希望能帮助其他遇到类似问题的人。

二、什么是会话保持

简单来说,就是客户端与服务器之间可以用通一个身份进行多次会话交流,即进行多次接口请求。比如这样的一个场景,我们登录淘宝,登录成功后,,我们去挑选商品,加入购物车,然后去购物车结账。我们会发现这中间是跳转了几个页面的,我们的操作也很顺畅,中间不会说再让我们输入用户名和密码,以确认我们的身份。但是以程序员的角度来看,这中间它其实是经过了几个接口的,比如,登录的接口,加入购物车的接口,购物车中结账的接口,起码有这三个接口。那么,我们有没有想过这样一个问题,比如登录的是张三这个用户,这个是在登录接口提交的用户信息,加入购物车的接口怎么知道加入购物车的是现在这个登录的张三加入的购物车,而不是李四,王五加入的购物车,同样,结账的接口也有这个问题。这里面就用到了会话保持,当我们登录成功后,后面跳转的页面,购物车,结账等都是带有我们的用户信息的,直至你关闭了浏览器,当你关闭浏览器,再重新打开后就是一个新的会话。有些人会问,当关闭再打开后不用再次登录页可以购买东西啊,这里面就是cookie的东西了,有兴趣的可以自行查资料,这里就不深入了。

三、为什么要用会话保持

至于为什么要用会话保持,应该是为了方便吧,当然这个只是我个人的理解,你想,如过不用会话保持,客户端请求后台的的接口中,所有需要用到用户信息的接口,你都得传个suerId或者token给服务器,不然服务器是没法知道你是哪个用户的,也就拿不到你的用户信息。对于后台服务器而言,每个用到用户信息的接口,他都得去根据suseId或者token去数据库或者缓存中查找一遍,缓存还好,去数据库查的话,用户量大了还是很费时的,耗性能。所以一般都是存在缓存中吧,以java Web为例,一般是存在session缓存中(因为后端的话我只学过java后端,只能以java举例了)。这里再介绍一下,java Web中有四大缓存作用域:

  1. page:指当前页面有效。在一个jsp页面里有效
  2. request:指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中
  3. session:用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期)
  4. application:是程序全局变量,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

好了,说了这么多,下面开始进入正题,如何实现Android端的会话保持,webview的会话保持,多个后短服务的session会话保持。

四、手动实现Android端会话保持

我这里用网络请求框架是okhttp,不过我用的是鸿洋大神封装过的一个改善库,它里面也有对会话保持的一些封装,不过我当时还不会用, 后面再仔细看了后才会用

https://github.com/hongyangAndroid/okhttputils

首先,我们需要知道,这个所谓的会话保持,其实就是在http或者https请求头或者响应头当中附了一些参数。响应头里面的字段叫做”Set-Cookie”,请求头里面的字段叫做”cookie”。这里不做详解,有兴趣的可以看下面这篇博客

http://blog.csdn.net/yaochangliang159/article/details/50433682

我们需要做的就是,当会话建立的时候我们把响应头里面的”Set-Cookie”当中的sessionId保存起来,在其他需要会话保持的接口的请求头加入”cookie”中,以”cookie”为键,保存的sessionId为值。这是因为,后台服务从缓存中拿出我们的用户信息的时候一般是从session中获取的,而每一个session都对应着一个会话, 拥有唯一的sessionId。之前我之所以不能正确的访问接口,就是因为我没有在请头中添加”cookie”键值对,所以就相当于新建了一个会话,领外生成了一个sessionId,所以后台服务器不能拿到我的个人信息,我就拿不到正确的响应。至于什么时候保存”Set-Cookie”中的sessionId,就看你的实际需求,会话的起点是哪,如果是登录成功后就是会话的起点,那么就在登录成功的接口的响应头操作,如果你们的后端服务是单独提供一个接口,让你传userId或者token来建立会话,那就在这个接口的响应头做操作。下面,看一下例子:

OkHttpUtils.get().url(Consts.HOMECHECKOUT_URL + MyApplication.getUserCredential())
                .build().execute(new Callback() {
            @Override
            public Object parseNetworkResponse(Response response, int id) throws Exception {
                JSONObject jsonObject = new JSONObject(response.body().string());
                if (jsonObject.getInt("code") == 200) {
                    //获取session的操作,session放在cookie头
                    Headers headers = response.headers();
                    List<String> cookies = headers.values("Set-Cookie");
                    String session = cookies.get(0);
                    //COOKIE = session.substring(0, session.indexOf(";"));//截取sessionid
                    SPUtils.putSessionCookie(getContext(), session)
                    Log.i("tag", "headers: " + headers.toString());
                    Log.i("tag", "sessionId: " + session);
                }
                return null;
            }

            @Override
            public void onError(Call call, Exception e, int id) {
                ToastUtils.showLongToast("服务器异常!");
            }

            @Override
            public void 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值