亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

網站流量的Cookie管理 網絡客戶端

網站流量的Cookie管理 網絡客戶端

躍然一笑 2022-09-22 19:41:16
我有一個 Web 客戶端,它將一個帶有登錄憑據的 JSON 對象發送到遠程服務器。然后,遠程服務器返回該 Cookie。之后,我需要將數據與cookie一起發布到該遠程服務器。但是,我無法弄清楚如何在POST中重復使用cookie。據我所知,登錄響應給出了以下結構,但是在POST上設置cookie的代碼需要或只是。MultiValueMap<String, ResponseCookie>MultiValueMap<String, String>cookie(String, String)我假設我一定錯過了一些轉換器的魔力,但那又如何呢?我甚至需要退回整個餅干嗎?餅干看起來像這樣;{SSO_Sticky_Session-47873-loadBalancedAdminGrp=[SSO_Sticky_Session-47873-loadBalancedAdminGrp=BNAMAKAKJABP; Path=/; HttpOnly], AUTH_TOKEN=[AUTH_TOKEN=v0l3baVZejIKjdzA1KGpkz4ccnosE6rKLQig1D2bdb-voFmVrF_aaYgzWl3Yc8QK; Path=/], uid=[uid=sjzipQdBtU30OlVbPWtDK2625i24i6t6g3Rjl5y5XcI=; Path=/], __cfduid=[__cfduid=dd872f39fd1d3bfe2a5c7316cd9ff63cd1554623603; Path=/; Domain=.aDomain.net; Max-Age=31535999; Expires=Mon, 6 Apr 2020 07:53:23 GMT; HttpOnly], JSESSIONID=[JSESSIONID=A264A713AD060EE12DA8215AEF66A3C0; Path=/aPath/; HttpOnly]}我的代碼在下面。為了簡潔起見,我刪除了內容類型;WebClient webClient = WebClient.create("https://remoteServer");MultiValueMap<String, ResponseCookie> myCookies;webClient  .post()  .uri("uri/login")  .body(Mono.just(myLoginObject), MyLogin.class)  .exchange()  .subscribe(r ->     System.err.println("Received:" + r.cookies());    myCookies = r.cookies();   );webClient  .post()  .uri("/uri/data")  .cookies(????) // what goes here ??  .body(....)  .exchange();
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

在編寫服務器端Java和JSP多年之后,我在很大程度上忽略了cookie的概念,因為管理是由(例如)服務器端的Tomcat和客戶端的瀏覽器負責的。在Spring中,任何對cookie處理的搜索總是集中在Spring服務器上,很少關注Spring實際上是另一個服務器的客戶端。WebClient 的任何示例都是過于簡單化的,并且沒有采用任何形式的安全協商。

在閱讀了餅干解釋維基百科餅干和餅干標準RFC6265之后,對我來說,為什么傳入的餅干在課堂上,而傳出的餅干是.傳入的 Cookie 在 (例如) 和 上具有其他元數據。ResponseCookieStringDomainPathMax-Age

對于我的實現,供應商沒有指定需要返回哪些 cookie,因此我最終返回了所有這些 Cookie。因此,我修改后的代碼如下;

WebClient webClient = WebClient.create("https://remoteServer");

MultiValueMap<String, String> myCookies = new LinkedMultiValueMap<String, String>()


webClient

  .post()

  .uri("uri/login")

  .body(Mono.just(myLoginObject), MyLogin.class)

  .exchange()

  .subscribe(r -> 

      for (String key: r.cookies().keySet()) {

        myCookies.put(key, Arrays.asList(r.cookies().get(key).get(0).getValue()));

      }

   );


webClient

  .post()

  .uri("/uri/data")

  .cookies(cookies -> cookies.addAll(myCookies))

  .body(....)

  .exchange();


查看完整回答
反對 回復 2022-09-22
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

由于已被棄用,但此線程出現在流行的搜索計算機上,因此讓我使用下面的代碼示例添加一個代碼示例以供將來參考。.exchange().exchangeToMono()


請注意,我使用一個,它將在bean發送的每個請求之前發送授權請求:ExchangeFilterFunctionwebClient


@Bean("webClient")

public WebClient webClient(ReactorResourceFactory resourceFactory,

    ExchangeFilterFunction authFilter) {

    var httpClient = HttpClient.create(resourceFactory.getConnectionProvider());

    var clientHttpConnector = new ReactorClientHttpConnector(httpClient);

    return WebClient.builder().filter(authFilter).clientConnector(clientHttpConnector)

        .build();

}


@Bean("authWebClient")

public WebClient authWebClient(ReactorResourceFactory resourceFactory) {

    var httpClient = HttpClient.create(resourceFactory.getConnectionProvider());

    var clientHttpConnector = new ReactorClientHttpConnector(httpClient);

    return WebClient.builder().clientConnector(clientHttpConnector).build();

}


@Bean

public ExchangeFilterFunction authFilter(@Qualifier("authWebClient") WebClient authWebClient,

    @Value("${application.url:''}") String url,

    @Value("${application.basic-auth-credentials:''}") String basicAuthCredentials) {

return (request, next) -> authWebClient.get()

    .uri(url)

    .header("Authorization", String.format("Basic %s", basicAuthCredentials))

    .exchangeToMono(response -> next.exchange(ClientRequest.from(request)

        .headers(headers -> {

            headers.add("Authorization", String.format("Basic %s", basicAuthCredentials));

        })

        .cookies(readCookies(response))

        .build()));

}


private Consumer<MultiValueMap<String, String>> readCookies(ClientResponse response) {

return cookies -> response.cookies().forEach((responseCookieName, responseCookies) ->

    cookies.addAll(responseCookieName,

        responseCookies.stream().map(responseCookie -> responseCookie.getValue())

            .collect(Collectors.toList())));

}


查看完整回答
反對 回復 2022-09-22
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

這個答案的靈感來自@J。


.exchange不應再使用。取而代之的是一個名為 的新方法。在 Lambda 的幫助下,可以編輯和轉換響應。餅干也可以被提取。在此示例中,Cookie 顯示在控制臺中。但它們也可以毫無問題地保存。.exchangeToMono


    public String getWebsiteWithCookies() {

        var webClient = WebClient.create();


        return webClient.post()

                .uri("url")

                // Your headers & so here

                .exchangeToMono(response -> {

                    MultiValueMap<String, ResponseCookie> cookies = response.cookies();

                    for (var cookie : cookies.entrySet()) {

                        System.out.println(cookie.getKey() + " : " + cookie.getValue());

                    }


                    return response.bodyToMono(String.class);

                })

                .block();

    }


查看完整回答
反對 回復 2022-09-22
  • 3 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號