wyouflf / xUtils3

Android orm, bitmap, http, view inject...

Home Page:https://gitee.com/wyouflf/xUtils3

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Cookie 自动使用

Sum-sdl opened this issue · comments

Cookie自动添加,我在登陆接口调用后会自动保存Cookie,调用其他接口在App没有退出的情况下Cookie能够获取到,App进程杀掉后,Cookie获取不到

SESSION ID 也是自动添加和设置的吗?

####################
RE: 是的

请问如何才能把Cookies保存到本地呢?

###########
默认自动保存到本地

通过框架里面的Cookie数据库,取出你想要的Cookie
DbCookieStore instance = DbCookieStore.INSTANCE;
List cookies = instance.getCookies();

默认和浏览器一样的策略管理cookie, 自动将cookie保存在DbCookieStore, 请求自动附件cookie信息.
获取和其他操作: DbCookieStore.INSTANCE....

要手动管理params.setUseCookie(false), 不自动保存和附加cookie到请求.
手动要获取请求中的cookie, 参考RequestInterceptListener的类文档说明(javadoc).

在header中设置cookie后在php的$_COOKIE中获取不到设置的cookie为什么

public List synCookies(Context context, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
DefaultHttpClient dh = (DefaultHttpClient) XutilsHttp.http.getHttpClient();
CookieStore cs = dh.getCookieStore();
List cookies = cs.getCookies();
int tag = 0;
for (int i = 0; i < cookies.size(); i++) {
if ("SHAREJSESSIONID".equals(cookies.get(i).getName())) {
tag = i;
break;
}
}
cookieManager.setCookie(url, cookies.get(tag).toString());// cookies是在HttpClient中获得的cookie
CookieSyncManager.getInstance().sync();

    return cookies;

}

大神,利用XUTILS3.0框架后如何让WEBVIEW同步XUTILS的COOKIE那?我用了N多个办法都无法解决,求大神指点,XUTILS3.0有没有考虑过这方面的问题?

DefaultHttpClient dh = (DefaultHttpClient) XutilsHttp.http.getHttpClient();
楼上的你确定这样搞????HttpClient不是3.0版本都被移除了吗?????

没事了大神,最后找到了不是框架的问题,是cookieManager.setCookie(url, “cookies数据”);这里的COOKIES 数据要重新拼接成一个正确的格式就OK了,附上格式 StringBuilder sbCookie = new StringBuilder();
sbCookie.append(String.format("SHAREJSESSIONID=%s", mCookie.getValue()));
sbCookie.append(String.format(";domain=%s", mCookie.getDomain()));
sbCookie.append(String.format(";path=%s", mCookie.getPath()));
String cookieValue = sbCookie.toString();

登陆到服务器,然后获取登陆后的信息......用户输入的密码是前台加密, 请问如何传参数???如何设置Cookies???大神们帮帮我

Androidshilei commented on Jan 11
Cookie自动添加,我在登陆接口调用后会自动保存Cookie,调用其他接口在App没有退出的情况下Cookie能够获取到,App进程杀掉后,Cookie获取不到

我也遇到了这个问题,请问有解决方法吗?

这个问题我也遇到过,APP如果异常,Cookie就获取不到了,我采用的方式是,在登陆成功,将cookie保存在SharedPreferences,然后自定义RequestParams。
x.http().post(requestParams, new NetCallBack() {
public void onSuccess(org.json.JSONObject result) {
try {
L.d("NET_Login_Goods:"+result.toString());
DbCookieStore instance = DbCookieStore.INSTANCE;
List cookies = instance.getCookies();
for (HttpCookie cookie:cookies){
String name = cookie.getName();
String value = cookie.getValue();
L.d(name+" "+value);
if("JSESSIONID".equals(name)){
myCookie =value;
SharedPreferences.Editor editor = context.getSharedPreferences(Constant.SP_NAME, context.MODE_PRIVATE).edit();
editor.putString("Cookie", myCookie);
editor.commit();
NetConstant.Cookie = myCookie;
break;
}
}
}}

自定义请求参数类

public class NetParams extends RequestParams {

public NetParams(String url, JSONObject params, int timeOut){
    super(Constant.EURL+url);
    setConnectTimeout(timeOut==0?30*1000:timeOut);
    if(params!=null)
        setBodyContent(params.toString());

if (!"/auth/getDate".equals(url)&&!"/api/auth".equals(url)) { //登陆 和不需要cookie的接口
SharedPreferences sharedPreferences = x.app().getSharedPreferences(Constant.SP_NAME, Context.MODE_PRIVATE);
NetConstant.Cookie = sharedPreferences.getString("Cookie", "");
addHeader("Cookie", "JSESSIONID="+NetConstant.Cookie);
setUseCookie(false);
addHeader("Content-Type", "application/json;charset=UTF-8");

    }else{
        setUseCookie(true);
    }



}

}

安卓正常退出(按返回键退出)用sp存储携带cookie,服务器能够找到session,为什么异常退出(直接home键,然后后台清理程序)服务器就找不到session了。

我的问题解决了,我的问题是因为过滤了太多不需要加cookie的url,虽然不知道为什么,但是解决了问题,贴出来让大家看看。
RequestParams params=new RequestParams(url);
if(NetUrl.LOGIN.equalsIgnoreCase(url)){

    }else{
        Log.e("TAG", "CommonUtils sessionid="+ MyApplication.SESSIONID);
        params.addHeader("Cookie", "JSESSIONID="+MyApplication.SESSIONID);
        params.addHeader("Content-Type", "application/json;charset=UTF-8");
        params.setUseCookie(true);
    }

注意最好只让登录接口过滤掉不需要添加cookie,其他接口都添加cookie,之前,就是把注册,广告,重置密码等都放到if里面,导致不能成功的添加cookie。

如何清理cookie?

现象:从服务器获取图片验证码,然后输入验证码后返回给服务器,明明是正确的总是显示验证失败!cookie的问题么? 我这个SESSIONID是红色的,啊啊啊
mRequestParams.addHeader("Cookie", "JSESSIONID="+ SCBaseApplication.SESSIONID);
mRequestParams.addHeader("Content-Type", "application/json;charset=UTF-8");

    mRequestParams.setUseCookie(true);

请问,我在用x.image().bind(ImageView view,String url)这个方法的时候怎么带上cookie呢?其它的Post请求使用默认设置就可以,就是用这个方法来设置服务器的图片的时候,不能访问服务器,设置不了图片,还请大神给解决一下,谢谢

我也遇到了问题 并且解决了问题。我后台是用asp.net

public void onSuccess(String result) {
               DbCookieStore instance = DbCookieStore.INSTANCE;
               List<HttpCookie> cookies = instance.getCookies();
               LogUtils.d( cookies);
               for (HttpCookie cookie : cookies) {
                   String name = cookie.getName();
                   String value = cookie.getValue();
                   if ("ASP.NET_SessionId".equals(name)) {
//SharedPreferences 保存
                       BaseApplication.spUtils.putString("cookie", value);
                       break;
                   }
               }
               success(result, handler, successWhat, failWhat);

           }

下面是自定义类
是将session id 保存在SharedPreferences

public class CCRequestParams extends RequestParams {
    public CCRequestParams() {
    }
    public CCRequestParams(String uri) {
        super(uri);
//SharedPreferences 读取
        String cookie = BaseApplication.spUtils.getString("cookie", "");
        if (!StringUtils.isEmpty(cookie)) {
            addHeader("Cookie", "ASP.NET_SessionId=" + cookie);
            setUseCookie(false);
        }
        LogUtils.d(cookie);
    }
    public CCRequestParams(String uri, ParamsBuilder builder, String[] signs, String[] cacheKeys) {
        super(uri, builder, signs, cacheKeys);
    }
}

关于Cookie的解析,存储及获取,真的有问题,希望作者可以实际测试一下:
在android7.0及以上的设备上使用域名作为地址时,使用

DbCookieStore instance = DbCookieStore.INSTANCE;
List<HttpCookie> cookies = instance.getCookies();

这种方式获取到的cookie字段不全,只有sessionId,服务器返回的其他cookie字段统统没有,但是在android 7.0以下的设备中没有问题,
这个bug的发生条件:

  • 使用域名作为主机地址
  • 在android7.0及以上的设备中

今天被这个bug坑了,真的是个深坑,希望作者可以实际测试一下.
最后使用RequestInterceptListener拦截了响应体,然后自己解析了响应头中的"Set-Cookie"才拿到服务端返回的所有cookie字段.

@wyouflf
通过addHeader("Cookie", "JSESSIONID=" + Common.cookieString); 设置的 cookie
和 进行以上设置后,进行网络请求通过以下代码获得的cookie不一致,这样的结果是正确的吗???

DbCookieStore instance = DbCookieStore.INSTANCE;
List cookies = instance.getCookies();

我遇到了一个问题:通过 setHeader() 设置的 cookieinstace.getCookie() 获取的 cookie 值不同,是不是 setHeader() 无效了?

##########
用params.setHeader

commented

@qiangxi RequestInterceptListener怎么用

@qiangxi RequestInterceptListener怎么用

@Sum-sdl 怎么自动使用

commented

x.http() 设置 CookieStore

不知道还有没有人用。分享一个我在开发中遇到的实际问题:Android 8.0以上cookie的domain匹配问题。背景:开发机通过fidler的代理,使用localhost访问宿主机上的web接口。在Android 8.0设备上,取得的cookie的domain是localhost.local,但使用cookie在数据库查询中匹配的是localhost,导致加不上cookie。而android 5.0就不会出现此问题。后来改用实际IP绕过了此问题。怀疑是android系统的cookie实现上的区别导致