簡體   English   中英

CookieManager-JAX-RS客戶端不會存儲cookie

[英]CookieManager - JAX-RS client won't store cookies

我正在開發一個簡單的Jersey客戶端應用程序,該應用程序執行GET請求,存儲cookie,然后在WebView(JavaFX)中打開URL。 當我沒有設置我的連接器ApacheConnectorProvider()時,我就可以正常工作。 當我注釋掉CookieManager中的一行存儲我的cookie時,但是當我取消注釋該行時,我的CookieManager中沒有任何cookie。 有人知道為什么是這樣嗎?

我的代碼如下>

import java.io.IOException;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.ProtocolException;
import java.net.URI;
import java.net.URL;
import java.util.List;

import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;

import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

import com.ftl.destroyer.ClientHelperJersey;

public class TestCookiesJersey extends Application {
private URL url = null;
private ClientHelperJersey clientHelper;
final URI proxySettings = null;

public TestCookiesJersey() {
    this.clientHelper = new ClientHelperJersey(proxySettings, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36");
}

public void startProcess(String query) throws IOException {     
    url = new URL("http://www.pacsun.com/");
    // GET request to server. goto first page.
    jerseyGETRequest(url);
    // display cookies.
    for (HttpCookie cookie : this.clientHelper.getCm().getCookieStore().getCookies()) {
        System.out.println(cookie.getName() + "   " +  cookie.getValue());
    }
    //
    CookieStore cookieJar = this.clientHelper.getCm().getCookieStore();
    List<HttpCookie> cookies = cookieJar.getCookies();
    for (HttpCookie cookie : cookies) {
        System.out.println("CookieHandler retrieved cookie: " + cookie);
    }
    launch();
}

public void jerseyGETRequest(URL url) throws IOException, ProtocolException {
    // build the GET request invocation.
    final Invocation invocation = this.clientHelper.addHeaders(this.clientHelper.getClient().target(url.toString()).request(), false).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8").header("Accept-Language", "en-US,en;q=0.8,da;q=0.6").header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").property("jersey.config.client.readTimeout", 15000).buildGet();
    final Response response = invocation.invoke();
    response.getCookies(); 
}

public void start(Stage stage) {
    stage.setTitle("TestCookiesJersey");
    BorderPane borderPane = new BorderPane();
    WebView webviewBrowser = new WebView();
    borderPane.setCenter(webviewBrowser);
    final WebEngine engine = webviewBrowser.getEngine();
    engine.load("http://www.pacsun.com/");
    engine.setJavaScriptEnabled(true);
    stage.setScene(new Scene(borderPane, 850, 600));
    stage.show();
}

public static void main(String[] args) {
    try {
        TestCookiesJersey destroyer = new TestCookiesJersey();
        destroyer.startProcess("");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

}

那是主類,然后使用幫助程序類來設置Jersey客戶端並設置ApacheConnector>

import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpCookie;
import java.net.URI;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Configuration;

import org.glassfish.jersey.apache.connector.ApacheClientProperties;
import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.RequestEntityProcessing;
import org.glassfish.jersey.filter.LoggingFilter;


public class ClientHelperJersey {
public CookieManager cm = new CookieManager();
private final String userAgent;
private final Client client;

public ClientHelperJersey(URI proxySettings, String userAgent) {
    CookieHandler.setDefault(cm);
    this.cm.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
    // below works, I can see the 1 cookie being set if I uncomment. 
    //HttpCookie cookie = new HttpCookie("MY_COOKIE", "MY_COOKIE_VALUE");
    //cookie.setDomain("foo.com");
    //this.cm.getCookieStore().add(null, cookie);
    this.userAgent = userAgent;
    ClientConfig config = new ClientConfig();
    config.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED);
    config.property(ApacheClientProperties.DISABLE_COOKIES, false);
    config.connectorProvider(new ApacheConnectorProvider());
    config.register(new LoggingFilter());
    config.register(new CookieFilter(this.cm));
    ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig((Configuration) config);
    this.client = clientBuilder.build();
}

public Client getClient() {
    return this.client;
}

public CookieManager getCm() {
    return this.cm;
}

public Invocation.Builder addHeaders(Invocation.Builder requestBuilder, boolean ajaxRequest) {      
    requestBuilder.header("User-Agent", this.userAgent);
    return requestBuilder;
}

}

如果我在ClientHelperJersey中將這一行注釋掉,則cookie由CookieManager保存>

config.connectorProvider(new ApacheConnectorProvider());

有誰知道如何使用ApacheConnectorProvider(),以便我可以保存cookie並在包含cookie的WebView中加載URL?

經過研究,我有一個可行的解決方案。 本質上,我想做的是使用Jersey客戶端的java.net.CookieManager (使用Apache連接器),並使用Jersey客戶端的java.net.CookieManagerjava.net.CookieStore將cookie加載到JavaFX WebView中。

感謝本文,我了解到WebView將安裝它自己的CookieHandler實現,並且您不應該:

浪費時間嘗試使用java.net.CookieManager和java.net.CookieStore。 它們可能會導致許多站點出現問題,因為它們執行了錯誤的標准。

我所做的工作是創建一個cookie列表,並確保在加載WebEngine之前,但在實例化WebView之后進行設置。

這是我的解決方案:

public void start(Stage stage) throws IOException {
    stage.setTitle("CookieManagerTest.");
    BorderPane borderPane = new BorderPane();
    WebView webviewBrowser = new WebView();
    borderPane.setCenter(webviewBrowser);
    URI uri = URI.create("http://www.pacsun.com/");
    Map<String, List<String>> headers = new LinkedHashMap<String, List<String>>();
    headers.put("Set-Cookie", Arrays.asList("cookie1=value1","cookie2=value2"));
    java.net.CookieHandler.getDefault().put(uri, headers);
    final WebEngine engine = webviewBrowser.getEngine();
    engine.setJavaScriptEnabled(true);
    engine.load(uri.toString());
    stage.setScene(new Scene(borderPane, 850, 600));
    stage.show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM