为什么 cookie 在后续请求中没有加载?

huangapple go评论89阅读模式
英文:

why cookie is not loaded for subsequent requests?

问题

我正在使用 okhttp 4.9.0

  1. private OkHttpClient http;
  2. public SonarApi(String serverUrl, String secret) {
  3. HttpLoggingInterceptor it = new HttpLoggingInterceptor();
  4. it.setLevel(Level.BODY);
  5. CookieManager cookieManager = new CookieManager();
  6. cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
  7. JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
  8. http = new OkHttpClient.Builder().addInterceptor(it).cookieJar(cookieJar).build();
  9. }
  10. public void login(String userName, String password) throws IOException {
  11. RequestBody formBody = new FormBody.Builder().add("login", userName).add("password", password).build();
  12. Request req = new Request.Builder()
  13. .addHeader("Accept", "application/json")
  14. .addHeader("Host", "x.x.x.x:9876")
  15. .addHeader("Origin", serverUrl)
  16. .addHeader("Content-Type", "application/x-www-form-urlencoded")
  17. .url(serverUrl + "/api/authentication/login").post(formBody).build();
  18. http.newCall(req).execute();
  19. }
  20. public boolean updateRuleMarkdownNote(String ruleKey, String mdNote) throws IOException {
  21. RequestBody formBody = new FormBody.Builder().add("key", ruleKey).add("markdown_note", mdNote).build();
  22. Request req = new Request.Builder().addHeader("Content-Type", "application/x-www-form-urlencoded").url(serverUrl + "/api/rules/update").post(formBody).build();
  23. int code = http.newCall(req).execute().code();
  24. return code >= 200 && code < 300;
  25. }
  26. public static void main(String[] args) {
  27. SonarApi sonarApi = new SonarApi("http://x.x.x.x:9876", "cac3b3c65347e87cdf1f9a7352935db79e2435f5");
  28. try {
  29. sonarApi.login("admin", "******");
  30. sonarApi.updateRuleMarkdownNote("custom-rules-java:ExampleRules01", "*foo*");
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }

日志:

  1. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  2. 信息: --&gt; POST http://172.25.160.238:9876/api/authentication/login
  3. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  4. 信息: Content-Length: 34
  5. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  6. 信息: Accept: application/json
  7. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  8. 信息: Host: 172.25.160.238:9876
  9. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  10. 信息: Origin: http://172.25.160.238:9876
  11. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  12. 信息: Content-Type: application/x-www-form-urlencoded
  13. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  14. 信息:
  15. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  16. 信息: login=admin&amp;password=%23Fgglgy0223
  17. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  18. 信息: --&gt; END POST (34-byte body)
  19. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  20. 信息: &lt;-- 200 http://172.25.160.238:9876/api/authentication/login (266ms)
  21. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  22. 信息: X-Frame-Options: SAMEORIGIN
  23. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  24. 信息: X-XSS-Protection: 1; mode=block
  25. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  26. 信息: X-Content-Type-Options: nosniff
  27. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  28. 信息: Set-Cookie: XSRF-TOKEN=5iohli0jdhtla6tk8a87598log; Max-Age=259200; Expires=Mon, 19-Jun-2023 06:44:23 GMT; Path=/
  29. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  30. 信息: Set-Cookie: JWT-SESSION=eyJhbGciOiJIUzI1NiJ9.eyJsYXN0UmVmcmVzaFRpbWUiOjE2ODY4OTc4NjMyNTMsInhzcmZUb2tlbiI6IjVpb2hsaTBqZgh0bGE2dGs4YTg3NTk4bG9nIiwianRpIjoiQVlqQzhxcFNkRWtsQ2VJdXhIQ0IiLCJzdWIiOiJBWHd3MUhN5ncNCN0xfa1UtMEhydyIsImlhdCI6MTY4Njg5Nzg2MywiZXhwIjoxNjg3MTU3MDYzfQ.sDbWX2_pNGIAIMjrgOBSyEnsBLc9fncz2-7XS_uyx-M; Max-Age=259200; Expires=Mon, 19-Jun-2023 06:44:23 GMT; Path=/; HttpOnly
  31. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  32. 信息: Content-Length: 0
  33. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  34. 信息: Date: Fri, 16 Jun 2023 06:44:23 GMT
  35. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  36. 信息: Keep-Alive: timeout=60
  37. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  38. 信息: Connection: keep-alive
  39. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  40. 信息: &lt;-- END HTTP (0-byte body)
  41. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  42. 信息: --&gt; POST http://172.25.160.238:9876/api/rules/update
  43. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  44. 信息: Content-Length: 58
  45. 六月 16, 2023 2:
  46. <details>
  47. <summary>英文:</summary>
  48. I am using okhttp 4.9.0
  49. ```java
  50. private OkHttpClient http;
  51. public SonarApi(String serverUrl, String secret) {
  52. HttpLoggingInterceptor it = new HttpLoggingInterceptor();
  53. it.setLevel(Level.BODY);
  54. CookieManager cookieManager = new CookieManager();
  55. cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
  56. JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
  57. http = new OkHttpClient.Builder().addInterceptor(it).cookieJar(cookieJar).build();
  58. }
  59. public void login(String userName, String password) throws IOException {
  60. RequestBody formBody = new FormBody.Builder().add(&quot;login&quot;, userName).add(&quot;password&quot;, password).build();
  61. Request req = new Request.Builder()
  62. .addHeader(&quot;Accept&quot;, &quot;application/json&quot;)
  63. .addHeader(&quot;Host&quot;, &quot;x.x.x.x:9876&quot;)
  64. .addHeader(&quot;Origin&quot;, serverUrl)
  65. .addHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;)
  66. .url(serverUrl + &quot;/api/authentication/login&quot;).post(formBody).build();
  67. http.newCall(req).execute();
  68. }
  69. public boolean updateRuleMarkdownNote(String ruleKey, String mdNote) throws IOException {
  70. RequestBody formBody = new FormBody.Builder().add(&quot;key&quot;, ruleKey).add(&quot;markdown_note&quot;, mdNote).build();
  71. Request req = new Request.Builder().addHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;).url(serverUrl + &quot;/api/rules/update&quot;).post(formBody).build();
  72. int code = http.newCall(req).execute().code();
  73. return code &gt;= 200 &amp;&amp; code &lt; 300;
  74. }
  75. public static void main(String[] args) {
  76. SonarApi sonarApi = new SonarApi(&quot;http://x.x.x.x:9876&quot;, &quot;cac3b3c65347e87cdf1f9a7352935db79e2435f5&quot;);
  77. try {
  78. sonarApi.login(&quot;admin&quot;, &quot;******&quot;);
  79. sonarApi.updateRuleMarkdownNote(&quot;custom-rules-java:ExampleRules01&quot;, &quot;*foo*&quot;);
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. }
  83. }

logs:

  1. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  2. 信息: --&gt; POST http://172.25.160.238:9876/api/authentication/login
  3. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  4. 信息: Content-Length: 34
  5. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  6. 信息: Accept: application/json
  7. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  8. 信息: Host: 172.25.160.238:9876
  9. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  10. 信息: Origin: http://172.25.160.238:9876
  11. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  12. 信息: Content-Type: application/x-www-form-urlencoded
  13. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  14. 信息:
  15. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  16. 信息: login=admin&amp;password=%23Fgglgy0223
  17. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  18. 信息: --&gt; END POST (34-byte body)
  19. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  20. 信息: &lt;-- 200 http://172.25.160.238:9876/api/authentication/login (266ms)
  21. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  22. 信息: X-Frame-Options: SAMEORIGIN
  23. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  24. 信息: X-XSS-Protection: 1; mode=block
  25. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  26. 信息: X-Content-Type-Options: nosniff
  27. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  28. 信息: Set-Cookie: XSRF-TOKEN=5iohli0jdhtla6tk8a87598log; Max-Age=259200; Expires=Mon, 19-Jun-2023 06:44:23 GMT; Path=/
  29. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  30. 信息: Set-Cookie: JWT-SESSION=eyJhbGciOiJIUzI1NiJ9.eyJsYXN0UmVmcmVzaFRpbWUiOjE2ODY4OTc4NjMyNTMsInhzcmZUb2tlbiI6IjVpb2hsaTBqZGh0bGE2dGs4YTg3NTk4bG9nIiwianRpIjoiQVlqQzhxcFNkRWtsQ2VJdXhIQ0IiLCJzdWIiOiJBWHd3MUhOY1NCN0xfa1UtMEhydyIsImlhdCI6MTY4Njg5Nzg2MywiZXhwIjoxNjg3MTU3MDYzfQ.sDbWX2_pNGIAIMjrgOBSyEnsBLc9fncz2-7XS_uyx-M; Max-Age=259200; Expires=Mon, 19-Jun-2023 06:44:23 GMT; Path=/; HttpOnly
  31. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  32. 信息: Content-Length: 0
  33. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  34. 信息: Date: Fri, 16 Jun 2023 06:44:23 GMT
  35. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  36. 信息: Keep-Alive: timeout=60
  37. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  38. 信息: Connection: keep-alive
  39. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  40. 信息: &lt;-- END HTTP (0-byte body)
  41. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  42. 信息: --&gt; POST http://172.25.160.238:9876/api/rules/update
  43. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  44. 信息: Content-Length: 58
  45. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  46. 信息: Content-Type: application/x-www-form-urlencoded
  47. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  48. 信息:
  49. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  50. 信息: key=custom-rules-java%3AExampleRules01&amp;markdown_note=*foo*
  51. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  52. 信息: --&gt; END POST (58-byte body)
  53. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  54. 信息: &lt;-- 401 http://172.25.160.238:9876/api/rules/update (7ms)
  55. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  56. 信息: X-Frame-Options: SAMEORIGIN
  57. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  58. 信息: X-XSS-Protection: 1; mode=block
  59. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  60. 信息: X-Content-Type-Options: nosniff
  61. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  62. 信息: Content-Length: 0
  63. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  64. 信息: Date: Fri, 16 Jun 2023 06:44:23 GMT
  65. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  66. 信息: Keep-Alive: timeout=60
  67. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  68. 信息: Connection: keep-alive
  69. 六月 16, 2023 2:42:54 下午 okhttp3.internal.platform.Platform log
  70. 信息: &lt;-- END HTTP (0-byte body)

after login, I can see setcookie header from server, but why cookies not loaded for subsequent requests? I can't figure it out why. as you can see in the logs, login request is successful and cookies named as XSRF-TOKEN and JWT-SESSION was returned within response headers, but the following request did not send a Cookie header with them.

答案1

得分: 0

HttpLoggingInterceptor没有打印来自CookieJar的cookie,因为它在内部拦截器加载来自CookieJar的cookie之前执行。

通过使用tcpdump,我可以看到后续请求的Cookie头。

案件已关闭。

英文:

HttpLoggingInterceptor didn't print cookies from CookieJar, because it was executed before the internal Interceptor which load cookie from CookieJar

By using tcpdump, I can see Cookie headers for subsequent requests.

case closed.

huangapple
  • 本文由 发表于 2023年6月16日 14:54:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/76487636.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定