2017-02-02 4 views
0

Ich arbeite an einer einfachen Jersey-Client-Anwendung, die eine GET-Anfrage durchführt, die Cookies speichert und dann die URL in WebView (JavaFX) öffnet. Ich habe das funktioniert, wenn ich nicht meinen Connector, der ApacheConnectorProvider() ist. Wenn ich diese Zeile auszeichne, speichert der CookieManager meine Cookies, aber wenn ich die Zeile auskommentiere, erhalte ich keine Cookies in meinem CookieManager. Weiß jemand, warum das so ist?CookieManager - JAX-RS-Client speichert keine Cookies

Mein Code wird wie folgt>

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

} 

Das ist die Hauptklasse ist, und dann verwende ich eine Hilfsklasse, die den Jersey-Client einrichtet und setzt den 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; 
} 

} 

Wenn ich Kommentar Diese eine Zeile in ClientHelperJersey die Cookies werden von der CookieManager>

gespeichert weiß jemand, wie man ApacheConnectorProvider() benutzt, um meine Cookies zu speichern und eine URL in WebView zu laden, die die Cookies enthält?

Antwort

0

Nach ein paar Recherchen habe ich eine funktionierende Lösung. Im Wesentlichen versuchte ich, den java.net.CookieManager von meinem Jersey-Klienten zu benutzen (unter Verwendung eines Apache-Verbinders) und meine Plätzchen in einen JavaFX WebView unter Verwendung der java.net.CookieManager und der java.net.CookieStore des Jersey Klienten zu laden.

Thanks to this article ich gelernt, dass WebView seine eigene Implementierung von CookieHandler installieren und Sie sollten nicht:

Ihre Zeit versuchen java.net.CookieManager und java.net.CookieStore zu verwenden. Sie verursachen wahrscheinlich Probleme mit vielen Websites, da sie den falschen Standard implementieren.

Was habe ich eine Liste von Cookies erstellt wurde und sorgte dafür, dass sie setzen, bevor ich meine WebEngine geladen, aber nachdem ich die WebView instanziiert.

Hier ist meine Lösung:

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(); 
Verwandte Themen