Как анализировать строку cookie

# The pipeline doesn't enumerate hashtables.
$ht = @{"foo" = 1; "bar" = 2}
$ht | measure

# Workaround: call GetEnumerator
$ht.GetEnumerator() | measure
28
задан cottonBallPaws 6 April 2011 в 13:31
поделиться

5 ответов

Полагаю, вам придется разбирать его вручную. Попробуйте это:

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;
}

Я на самом деле не скомпилировал и не запустил этот код, но он должен быть хорошим началом. Возможно, вам придется немного поэкспериментировать с датой: я не уверен, что формат даты, используемый в куки, фактически совпадает с форматом DateFormat.FULL. (Изучите этот вопрос, связанный с , который касается обработки формата даты в файлах cookie.) Также обратите внимание, что есть некоторые атрибуты cookie, которые не обрабатываются в BasicClientCookie, такие как version и httponly.

Наконец, в этом коде предполагается, что имя и значение файла cookie отображаются в качестве первого атрибута: я не уверен, что это действительно так, но именно так упорядочены все файлы cookie, которые я когда-либо видел.

12
ответ дан 20 November 2019 в 01:50
поделиться

Для этого вы можете использовать возможности Apache HttpClient .
Вот выдержка из CookieJar :

CookieSpec cookieSpec = new BrowserCompatSpec();

List<Cookie> parseCookies(URI uri, List<String> cookieHeaders) {
    ArrayList<Cookie> cookies = new ArrayList<Cookie>();
    int port = (uri.getPort() < 0) ? 80 : uri.getPort();
    boolean secure = "https".equals(uri.getScheme());
    CookieOrigin origin = new CookieOrigin(uri.getHost(), port,
            uri.getPath(), secure);
    for (String cookieHeader : cookieHeaders) {
        BasicHeader header = new BasicHeader(SM.SET_COOKIE, cookieHeader);
        try {
            cookies.addAll(cookieSpec.parse(header, origin));
        } catch (MalformedCookieException e) {
            L.d(e);
        }
    }
    return cookies;
}
8
ответ дан 20 November 2019 в 01:50
поделиться

С помощью регулярного выражения, такого как:

([^=]+)=([^\;]+);\s?

, вы можете анализировать cookie следующим образом:

.COOKIEAUTH=5DEF0BF530F749AD46F652BDF31C372526A42FEB9D40162167CB39C4D43FC8AF1C4B6DF0C24ECB1945DFF7952C70FDA1E4AF12C1803F9D089E78348C4B41802279897807F85905D6B6D2D42896BA2A267E9F564814631B4B31EE41A483C886B14B5A1E76FD264FB230E87877CB9A4A2A7BDB0B0101BC2C1AF3A029CC54EE4FBC; 
expires=Sat, 30-Jul-2011 01:22:34 GMT; 
path=/; HttpOnly

в нескольких строках кода.

6
ответ дан 20 November 2019 в 01:50
поделиться
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();
0
ответ дан 20 November 2019 в 01:50
поделиться
        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()
-1
ответ дан 20 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: