当前位置: 首页 > 面试题库 >

如何解析Cookie字符串

邬朗
2023-03-14
问题内容

我想要一个Cookie字符串(因为它可能会在Set-Cookie标头中返回),并且能够轻松修改其中的一部分,特别是到期日期。

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

我在api级别9中看到他们添加了具有解析方法的HttpCookie,但是我需要在以前的版本中工作。

有任何想法吗?

谢谢


问题答案:

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

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

我尚未真正编译或运行此代码,但这应该是一个好的开始。您可能需要对日期解析进行一些调整:我不确定cookie中使用的日期格式实际上是否与相同DateFormat.FULL。(查看此相关的问题,该地址在处理Cookie中的日期格式。)另外,还要注意有一些cookie的属性没有被处理BasicClientCookie,如versionhttponly

最后,此代码假定cookie的名称和值显示为第一个属性:我不确定这是否一定是正确的,但这就是我见过的每个cookie的排序方式。



 类似资料:
  • 我有一根绳子 然后我想将其解析为sqlDate。并将其插入数据库。 是否可以将该字符串解析为sqlDate?!?! 是的,sql日期格式是“yyyy-mm-dd”

  • 问题内容: 我正在尝试解析以下JSONString 这是我的代码: 有人可以帮忙,我的代码不起作用吗?我想解析标题,公司名称,类别等… 问题答案: 您需要从您的jsonstring 创建。 你有里面然后..

  • 问题内容: 我试图解析一个字符串,以分隔字符串中的列表。我目前有字符串: 有什么方法可以解析字符串,以便字典键是列表的第一个元素,而键的值是元素的下一个。例如: 问题答案: insted的的,你可以有列表: 您可以使用从字符串解析Python数据结构

  • 我有一个自托管的WCF服务,其endpoint设置为WebHttpBinding监听HTTP请求。我需要访问随这些请求传递的cookies。我可以获得头值,但我仍然需要进行实际的解析。我的实现尝试是使用: 此代码的问题在于希望Cookie用逗号分隔(),而浏览器倾向于使用分号()。由于RFC6265只允许使用分号作为分隔符(尽管旧的RFC同时允许使用分号和分号),我有点困惑为什么只支持逗号。现在,

  • 问题内容: 我有这个字符串:10,692,467,440,017.120(是一个数字)。 我想将其解析为BigDecimal。问题是我没有尝试过DecimalFormat和NumbeFormat。有什么帮助吗? 问题答案: 试试这个 如果要构建具有I18N支持的应用程序,则应使用 还请记住,它可能会引发a,因此您需要处理它(使用try / catch)或引发它,然后让程序的另一部分处理它

  • 问题内容: 我有一个弦 然后,我想将其解析为sqlDate。并将其插入数据库。 是否可以将该字符串解析为sqlDate?!?! 是的,SQL日期格式为“ yyyy-mm-dd” 问题答案: 用于将String日期解析为java.util.Date 然后使用millis将其转换为java.sql.Date