代码之家  ›  专栏  ›  技术社区  ›  Nicholas DiPiazza

为什么http组件HttpClient从Cookie值中删除引号?

  •  2
  • Nicholas DiPiazza  · 技术社区  · 7 年前

    https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore 4.4.7执行rest api调用。

    我遇到了一种情况,我要针对一个安全的web应用程序制作一个API:

    https://myapp.com/api/myrestrequest

    它发现我丢失了一个JESSIONID cookie,所以它通过302将我发送到另一个页面以获取一个:

    302获取请求2: https://myapp.com/sso/dologin?referer=/api/myrestrequest

    此页读取我的SSO会话cookie,然后将我发送回原始请求:

    https://myapp.com/api/myrestrequest

    很简单,很正常。但是在GET请求2中,创建了一个特殊的cookie,如下所示:

    J-Login-Cookie="a8966ab6c6d65a7d6a"
    

    J-Login-Cookie=a8966ab6c6d65a7d6a
    

    它删除引号。

    为什么?我得用一个 HttpRequestInterceptor

    curl 不具有相同的行为。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Eir Nym    6 年前

    有一个 question 关于相反的行为。

    我还发现 an explanation

    HTTP State Management Mechanism RFC

    :

    Apache HTTP客户端cookie的源 parser tests 为了它。链接到 master 分支,可根据需要自由调整分支和提交版本。

        2
  •  1
  •   Joseph Bui    6 年前

    将从以下值中删除周围的引号:

    https://android.googlesource.com/platform/libcore/+/android-cts-7.0_r1/ojluni/src/main/java/java/net/HttpCookie.java#1110

    从外观上看,你可以用撇号把你引用的值括起来。在发出重定向请求之前,遍历所有cookies以查找 J-Login-Cookie 并将值从 "a8966ab6c6d65a7d6a" '"a8966ab6c6d65a7d6a"' 所以只有外部的撇号会被删除。

    这与使用拦截器基本相同。您唯一的其他选择是使用不同的HTTP客户机库。