Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析cookie字符串_Java_Android_String_Cookies - Fatal编程技术网

Java 如何解析cookie字符串

Java 如何解析cookie字符串,java,android,string,cookies,Java,Android,String,Cookies,我希望获得一个Cookie字符串(因为它可能在一个集合Cookie头中返回),并能够轻松地修改其中的部分内容,特别是过期日期 我看到有几个不同的Cookie类,比如BasicClientCookie,但是我没有看到任何简单的方法将字符串解析为这些对象之一 我看到他们在api级别9中添加了一个解析方法,但我需要一些东西在以前的版本中工作 有什么想法吗 谢谢我相信您必须手动解析它。试试这个: BasicClientCookie parseRawCookie(String rawCookie) thr

我希望获得一个Cookie字符串(因为它可能在一个集合Cookie头中返回),并能够轻松地修改其中的部分内容,特别是过期日期

我看到有几个不同的Cookie类,比如BasicClientCookie,但是我没有看到任何简单的方法将字符串解析为这些对象之一

我看到他们在api级别9中添加了一个解析方法,但我需要一些东西在以前的版本中工作

有什么想法吗


谢谢

我相信您必须手动解析它。试试这个:

BasicClientCookie parseRawCookie(String rawCookie) throws Exception {
    String[] rawCookieParams = rawCookie.split(";");

    String[] rawCookieNameAndValue = rawCookieParams[0].split("=");
    if (rawCookieNameAndValue.length != 2) {
        throw new Exception("Invalid cookie: missing name and value.");
    }

    String cookieName = rawCookieNameAndValue[0].trim();
    String cookieValue = rawCookieNameAndValue[1].trim();
    BasicClientCookie cookie = new BasicClientCookie(cookieName, cookieValue);
    for (int i = 1; i < rawCookieParams.length; i++) {
        String rawCookieParamNameAndValue[] = rawCookieParams[i].trim().split("=");

        String paramName = rawCookieParamNameAndValue[0].trim();

        if (paramName.equalsIgnoreCase("secure")) {
            cookie.setSecure(true);
        } else {
            if (rawCookieParamNameAndValue.length != 2) {
                throw new Exception("Invalid cookie: attribute not a flag or missing value.");
            }

            String paramValue = rawCookieParamNameAndValue[1].trim();

            if (paramName.equalsIgnoreCase("expires")) {
                Date expiryDate = DateFormat.getDateTimeInstance(DateFormat.FULL)
                        .parse(paramValue);
                cookie.setExpiryDate(expiryDate);
            } else if (paramName.equalsIgnoreCase("max-age")) {
                long maxAge = Long.parseLong(paramValue);
                Date expiryDate = new Date(System.getCurrentTimeMillis() + maxAge);
                cookie.setExpiryDate(expiryDate);
            } else if (paramName.equalsIgnoreCase("domain")) {
                cookie.setDomain(paramValue);
            } else if (paramName.equalsIgnoreCase("path")) {
                cookie.setPath(paramValue);
            } else if (paramName.equalsIgnoreCase("comment")) {
                cookie.setPath(paramValue);
            } else {
                throw new Exception("Invalid cookie: invalid attribute name.");
            }
        }
    }

    return cookie;
}
BasicClientCookie parseRawCookie(字符串rawCookie)引发异常{
字符串[]rawCookieParams=rawCookie.split(“;”);
字符串[]rawCookieNameAndValue=rawCookieParams[0]。拆分(“”);
if(rawCookieNameAndValue.length!=2){
抛出新异常(“无效cookie:缺少名称和值”);
}
字符串cookieName=rawCookieNameAndValue[0].trim();
字符串cookieValue=rawCookieNameAndValue[1].trim();
BasicClient cookie cookie=新的BasicClient cookie(cookieName,cookieValue);
for(int i=1;i
我还没有编译或运行这段代码,但这应该是一个良好的开端。您可能需要稍微处理一下日期解析:我不确定cookies中使用的日期格式是否与
DateFormat.FULL
中的日期格式相同。(查看相关问题,其中涉及处理cookie中的日期格式。)此外,请注意,有些cookie属性不是由
BasicClientCookie
处理的,例如
version
httponly


最后,这段代码假设cookie的名称和值作为第一个属性出现:我不确定这是否一定是真的,但我见过的每个cookie都是这样排序的。

使用正则表达式,如:

([^=]+)=([^\;]+);\s?
您可以像这样解析cookie:

.COOKIEAUTH=5DEF0BF530F749AD46F652BDF31C372526A42FEB9D40162167CB39C4D43FC8AF1C4B6DF0C24ECB1945DFF7952C70FDA1E4AF12C1803F9D089E78348C4B41802279897807F85905D6B6D2D42896BA2A267E9F564814631B4B31EE41A483C886B14B5A1E76FD264FB230E87877CB9A4A2A7BDB0B0101BC2C1AF3A029CC54EE4FBC; 
expires=Sat, 30-Jul-2011 01:22:34 GMT; 
path=/; HttpOnly
只需几行代码。

您就可以使用ApacheHttpClient的工具来实现这一点。
以下是一段摘录:

CookieSpec CookieSpec=new BrowserCompatSpec();
ListParseCookie(URI、ListCookieHeaders){
ArrayList cookies=新的ArrayList();
int-port=(uri.getPort()<0)?80:uri.getPort();
boolean secure=“https.”等于(uri.getScheme());
CookieOrigin=新的CookieOrigin(uri.getHost(),端口,
uri.getPath(),secure);
for(字符串cookieHeader:cookieHeaders){
BasicHeader header=新BasicHeader(SM.SET_COOKIE,cookieHeader);
试一试{
addAll(cookieSpec.parse(header,origin));
}捕获(格式错误的Okiee异常){
法律博士(e);
}
}
归还饼干;
}

Yanchenko使用ApacheHTTP客户端的方法的优点是,它根据源代码验证与规范一致的cookie。正则表达式方法不会做到这一点,但您可能不需要这样做

public class CookieUtil {

    public List<Cookie> parseCookieString(String cookies) {
        List<Cookie> cookieList = new ArrayList<Cookie>();
        Pattern cookiePattern = Pattern.compile("([^=]+)=([^\\;]*);?\\s?");
        Matcher matcher = cookiePattern.matcher(cookies);
        while (matcher.find()) {
            int groupCount = matcher.groupCount();
            System.out.println("matched: " + matcher.group(0));
            for (int groupIndex = 0; groupIndex <= groupCount; ++groupIndex) {
                System.out.println("group[" + groupIndex + "]=" + matcher.group(groupIndex));
            }
            String cookieKey = matcher.group(1);
            String cookieValue = matcher.group(2);
            Cookie cookie = new BasicClientCookie(cookieKey, cookieValue);
            cookieList.add(cookie);
        }
        return cookieList;
    }
}
公共类CookieUtil{
公共列表parseCookieString(字符串cookies){
List-cookieList=new-ArrayList();
Pattern cookiePattern=Pattern.compile(([^=]+)=([^\\;]*);?\\s?);
Matcher Matcher=cookiePattern.Matcher(cookies);
while(matcher.find()){
int groupCount=matcher.groupCount();
System.out.println(“匹配:+matcher.group(0));
对于(int groupIndex=0;groupIndex

List cookies=HttpCookie.parse(头);

很有趣,但是
java.net.HttpCookie
类无法解析带有域和/或路径部分的cookie字符串,而这正是
java.net.HttpCookie
类转换为字符串的部分

例如:

HttpCookie newCookie = new HttpCookie("cookieName", "cookieValue");
newCookie.setDomain("cookieDomain.com");
newCookie.setPath("/");
由于此类既不实现可序列化也不实现可打包,因此很容易将Cookie存储为字符串

saveMyCookieAsString(newCookie.toString());
此语句将以以下格式保存cookie:

cookieName="cookieValue";$Path="/";$Domain="cookiedomain.com"
然后你想还原这个cookie,所以你得到了字符串:

String cookieAsString = restoreMyCookieString();
并尝试解析它:

List<HttpCookie> cookiesList = HttpCookie.parse(cookieAsString);
StringBuilder myCookieAsStringNow = new StringBuilder();
for(HttpCookie httpCookie: cookiesList) {
    myCookieAsStringNow.append(httpCookie.toString());
}
域和路径部分刚刚消失。原因:解析方法对“域”和“路径”等词区分大小写。
可能的解决方法:提供另一个toString()方法,如:

public static String httpCookieToString(HttpCookie httpCookie) {
    StringBuilder result = new StringBuilder()
            .append(httpCookie.getName())
            .append("=")
            .append("\"")
            .append(httpCookie.getValue())
            .append("\"");

    if(!TextUtils.isEmpty(httpCookie.getDomain())) {
        result.append("; domain=")
                .append(httpCookie.getDomain());
    }
    if(!TextUtils.isEmpty(httpCookie.getPath())){
        result.append("; path=")
                .append(httpCookie.getPath());
    }

    return result.toString();
}
我觉得它很有趣(特别是像
java.net.HttpCookie
这样的类,它们的目标是被越来越多的人使用),我希望它对某些人有用。

CookieManager CookieManager=new CookieManager();
CookieManager cookieManager = new CookieManager();
        CookieHandler.setDefault(cookieManager);
        HttpCookie cookie = new HttpCookie("lang", "en");
        cookie.setDomain("Your URL");
        cookie.setPath("/");
        cookie.setVersion(0);

        cookieManager.getCookieStore().add(new URI("https://Your URL/"), cookie);
        List<HttpCookie> Cookies =  cookieManager.getCookieStore().get(new URI("https://Your URL/"));
        String s = Cookies.get(0).getValue();
setDefault(cookieManager); HttpCookie cookie=新Http
cookieName=cookieValue
public static String httpCookieToString(HttpCookie httpCookie) {
    StringBuilder result = new StringBuilder()
            .append(httpCookie.getName())
            .append("=")
            .append("\"")
            .append(httpCookie.getValue())
            .append("\"");

    if(!TextUtils.isEmpty(httpCookie.getDomain())) {
        result.append("; domain=")
                .append(httpCookie.getDomain());
    }
    if(!TextUtils.isEmpty(httpCookie.getPath())){
        result.append("; path=")
                .append(httpCookie.getPath());
    }

    return result.toString();
}
CookieManager cookieManager = new CookieManager();
        CookieHandler.setDefault(cookieManager);
        HttpCookie cookie = new HttpCookie("lang", "en");
        cookie.setDomain("Your URL");
        cookie.setPath("/");
        cookie.setVersion(0);

        cookieManager.getCookieStore().add(new URI("https://Your URL/"), cookie);
        List<HttpCookie> Cookies =  cookieManager.getCookieStore().get(new URI("https://Your URL/"));
        String s = Cookies.get(0).getValue();
        val headers = ..........


        val headerBuilder = Headers.Builder()

        headers?.forEach {
            val values = it.split(";")
            values.forEach { v ->
                if (v.contains("=")) {
                    headerBuilder.add(v.replace("=", ":"))
                }
            }
        }

        val headers = headerBuilder.build()