为了保持服务端的session,我首先想到的办法就是没隔一段时间调用一下我们的服务器。
之前出了总总问题,什么timeoutException,ClientProtocolException等等问题,我讲慢慢解释.
我在service中做轮询调用服务器保持session时,只要出现一次timeoutexception,接着就会出现ClientProtocolException,后来发现这是重定向导致的问题,然后在AsyncHttpClient中设置了
client.setEnableRedirects(false);
client.getHttpClient().getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, false);
但是这么一设置又会出一个问题,我在登录的时候总是报302,又回到了重定向的问题。
我发现服务端在给我设置attribute传递cookies的时候,使用了重定向。没办法,只能将setEnableRedirects再次打开。
还有一个问题就是在AsyncHttpClient话说是自动保存CookieStore的,但是我打印了log,结果CookieStore是为null,导致我在做轮询的时候,是没有向服务端提交Cookie的,这样过了30分钟服务端的session任然会超时。
于是手动的加上
CookieStore cookieStore = new PersistentCookieStore(this);
cline.setCookieStore(cookieStore);
然后打印log
CookieStore cookieStore = new PersistentCookieStore(this);
cline.setCookieStore(cookieStore);
HttpContext httpContext = cline.getHttpContext();
CookieStore cookies = (CookieStore) httpContext.getAttribute(ClientContext.COOKIE_STORE);
if(cookies!=null){
for(Cookie c:cookies.getCookies()){
LogUtil.d("login activtity onsuccess before ~~"+c.getName(),c.getValue());
}
}else{
LogUtil.d("login activtity onsuccess before~~","cookies is null");
}
发现这次才有值。
哈哈,明白了吧,你需要在登录的时候手动添加
CookieStore cookieStore = new PersistentCookieStore(this);
cline.setCookieStore(cookieStore);
才可以的。