温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android获取Cookies,持久化PHPSESSID (OkHttp ;HttpClient ;Afinal)

发布时间:2020-06-29 09:57:51 来源:网络 阅读:3107 作者:拾荒者老大 栏目:移动开发

公司后台是用PHP实现的,为了安全需要在每次请求头传过去PHPSESSID进行验证

.addHeader("Cookie", "PHPSESSID="+ToolsUser.getPhpsessid())

之前项目使用的afinal的FinalHttp模块来请求数据

https://github.com/yangfuhai/afinal

这个本质上是封装的httpclient,所以获取方法和httpclient类似

AjaxParams params = new AjaxParams();
params.put("x", "xxx");
params.put("xx", "xx");
new FinalHttp().get("url", params, new AjaxCallBack<String>() {
    @Override
    public void onSuccess(String t) {
        super.onSuccess(t);
        DefaultHttpClient dh = (DefaultHttpClient) http.getHttpClient();
	CookieStore cookieStore = dh.getCookieStore();
	List<Cookie> cookies = cookieStore.getCookies();
	for (int i = 0, len = cookies.size(); i < len; i++) {
	    if ("PHPSESSID".equals(cookies.get(i).getName())) {
		String phpsessid = cookies.get(i).getValue();
	    }
	}
    });
}

之前一直没找到方法,直到在某个地方看到HttpClient获取cookies的方法,

于是试着获取FinalHttp的DefaultHttpClient对象,这样就可以了.
其他获取cookies可以参考这

https://github.com/fantouch/hack10086/commit/0a8d77fdaef1a1f71d579f00366b3e4f818e90a6 

在第一次请求时获取到的PHPSESSID保存,然后在以后每一次请求时

new FinalHttp().addHeader("Cookie", "PHPSESSID=" + phpsessid)

这样就能保存用户的登录状态了.

后来换到Android Studio 升级了SDK,返现httpclient已经成过时的方法了.....

网络请求换成OkHttp 

网上找了不少保持cookies的方法,很坑,都是抄来抄去的文章,内容雷同,而且,基本都用不上...

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            String t = run1("url?x=xxx&xx=xx");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();
private String run1(String url) throws IOException {
    Request request = new Request.Builder().url(url).build();
    Response response = client.newCall(request).execute();
    String string = response.body().string();
    return string;
}
private OkHttpClient client = new OkHttpClient.Builder().cookieJar(new CookieJar() {

    private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
    
    @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
       if (cookies != null) {
             for (int i = 0, len = cookies.size(); i < len; i++) {
                  if ("PHPSESSID".equals(cookies.get(i).name())) {
                       String phpsessid = cookies.get(i).value();
                   }
              }
       }
       cookieStore.put(url, cookies);
    }

    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        List<Cookie> cookies = cookieStore.get(url);
        return cookies != null ? cookies : new ArrayList<Cookie>();
    }
}).build();

忘了上面那些方法在哪看到的了,感谢.

这样获取之后,也是在每次请求时

.addHeader("Cookie", "PHPSESSID="+phpsessid)

记录一下,下回有用的别的网络请求框架再补充进去

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI