Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cookie 自动使用 #125

Closed
Sum-sdl opened this issue Jan 11, 2016 · 24 comments
Closed

Cookie 自动使用 #125

Sum-sdl opened this issue Jan 11, 2016 · 24 comments

Comments

@Sum-sdl
Copy link

Sum-sdl commented Jan 11, 2016

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

@shenzhiguo
Copy link

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

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

@kevintkm
Copy link

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

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

@Sum-sdl
Copy link
Author

Sum-sdl commented Jan 18, 2016

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

@wyouflf
Copy link
Owner

wyouflf commented Jan 22, 2016

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

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

@ltigers
Copy link

ltigers commented Mar 11, 2016

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

@xiedong
Copy link

xiedong commented Mar 25, 2016

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有没有考虑过这方面的问题?

@Chimneyone
Copy link

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

@xiedong
Copy link

xiedong commented Apr 22, 2016

没事了大神,最后找到了不是框架的问题,是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();

@Chimneyone
Copy link

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

@JolanWong7
Copy link

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

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

@Huangzhe
Copy link

这个问题我也遇到过,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);
    }



}

}

@HRobbie
Copy link

HRobbie commented Jun 23, 2016

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

@HRobbie
Copy link

HRobbie commented Jun 23, 2016

我的问题解决了,我的问题是因为过滤了太多不需要加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。

@394090466
Copy link

如何清理cookie?

@xiyangyang8110
Copy link

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

    mRequestParams.setUseCookie(true);

@zhangmanke
Copy link

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

@GaoZhenXing
Copy link

我也遇到了问题 并且解决了问题。我后台是用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);
    }
}

@qiangxi
Copy link

qiangxi commented Jun 26, 2017

关于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字段.

@leeGYPlus
Copy link

leeGYPlus commented Jan 4, 2018

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

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

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

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

@1280103995
Copy link

@qiangxi RequestInterceptListener怎么用

1 similar comment
@zhaohuanhui
Copy link

@qiangxi RequestInterceptListener怎么用

@zhaohuanhui
Copy link

@Sum-sdl 怎么自动使用

@mosentest
Copy link

x.http() 设置 CookieStore

@luohc2004
Copy link

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

@wyouflf wyouflf closed this as completed Aug 21, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests