Android模拟浏览器维持Session

作者: 小吉快跑呀 | 来源:发表于2017-11-07 21:56 被阅读119次

我们都知道,HTTP协议是无状态的,一旦数据交换完毕,连接就关闭,客户端和服务端互不相关,那么浏览器是怎么做到维持登录状态的呢还有保持用户数据的呢?答案是利用Cookie和Session。
我们来看看这张图。


image.png

此图是我第一次打开http://www.iconfont.cn/的返回头。画出红框的的是第一次请求 Servelet 或者 Jsp 等服务端程序返回的。
然后我刷新该页面,返回头变成了下图所示

image.png
留意到Set-Cookie只变成了一个了吗。这是后台的处理。
另外一个其实加入到了请求头的Cookie中,这是浏览器的默认行为,用于维持服务端的Session对象
在此后面的请求,浏览器则会将其加入请求头的Cookie中,其中保存着一些用户的数据。
显然,在安卓端我们也可以模仿这种做法(当然,前提是后台的确有利用Cookie和Session存储数据)

下面我以Retrofit为例编写代码

//Interceptor即拦截器,可用于修改请求前的请求体,以及请求后的返回体
public class CookieInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {

    String cookie;
    Request request;
    Response response;
    //cookieMgr是封装的一个SharePreference类。 这里不用太在意
    CookieMgr cookieMgr = new CookieMgr("cookie")

    //获取存储在本地的cookie
    if(!(cookie = cookieMgr.get("Set-Cookie","")).equals("")){
        Request.Builder builder = chain.request().newBuilder();

    //将cookie加入请求头中
        builder.addHeader("Cookie",cookie);
        request = builder.build();
        Log.e("CookieInterceptor",cookie);
    }else{
        request = chain.request();
    }

    response = chain.proceed(request);
    //如果是第一次请求,则会在返回头得到Set-Cookie。获取并存储在本地
    if(response.header("Set-Cookie") != null){
        cookieMgr .clear("Set-Cookie");
        cookieMgr .save("Set-Cookie",response.header("Set-Cookie"));
    }

    return response;
}

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(8, TimeUnit.SECONDS)
            //构建okhttpClient加入自定义的拦截器,实现每次请求都加入Cookie
            .addInterceptor(new CookieInterceptor())
            .build();

    client = new Retrofit.Builder().client(okHttpClient).baseUrl(Constant.IP)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build().create(Api.class);

到此,每次用Retrofit请求数据,都会带上Cookie,服务端的Session就得以维持。
后台就可以利用维持的Session或Cookie存储数据,实现需求,比如维持登录状态,带验证码的登录,等等

相关文章

  • Android模拟浏览器维持Session

    我们都知道,HTTP协议是无状态的,一旦数据交换完毕,连接就关闭,客户端和服务端互不相关,那么浏览器是怎么做到维持...

  • 手机模拟器调试Web项目

    iOS模拟器 直接打开Safari浏览器,输入localhost的地址就会出现项目的页面。 Android模拟器 ...

  • cookie和session的区别

    Cookie是客户端的存储空间,由浏览器来维持。 Session是由应用服务器维持的一个服务器端的存储空间,用户在...

  • Vue之登录后个人中心显示账号信息(三)

    cookie和session都是用来跟踪浏览器用户身份的会话方式。 cookie保存在浏览器端,session保存...

  • 2017.7.17

    模拟登陆问题cookiejar + session不能使用 request这是因为 session.get 能够在...

  • django---session/redis/隔行换色

    (一)引入session Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持C...

  • django---session/redis/隔行换色

    (一)引入session Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持C...

  • 第一个Meteor APP

    创建Meteor应用 进入myapp目录cd myapp 添加Android支持 在浏览器中运行 在模拟器中运行 ...

  • SpringBoot+Shiro+Redis

    1、实现共享Session 1、重新设置 session 及 cookie 去除 httpOnly 浏览器...

  • express-session

    cookie是存储在浏览器上的,session是保存在服务器上的 session只要关闭浏览器就会销毁sessio...

网友评论

    本文标题:Android模拟浏览器维持Session

    本文链接:https://www.haomeiwen.com/subject/darsmxtx.html