2016-03-09 24 views
7

Chcę przeczytać JSESSIONID z pliku cookie org.eclipse.swt.browser.Browser. Próbuję otworzyć przeglądarkę z wtyczki Eclipse. Używam poniżej snippetJak odczytać plik cookie z pliku org.eclipse.swt.browser.Browser?

public static void main(String[] args) 
{ 
    Display display = new Display(); 

    Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new FillLayout()); 

    final Browser browser = new Browser(shell, SWT.NONE); 

    final String url = "https://...."; 
    browser.setUrl(url); 
    browser.addProgressListener(new ProgressAdapter() { 
     @Override 
     public void completed(ProgressEvent event) { 
      String cookieText = "cookie=" + Browser.getCookie("JSESSIONID", url); 
      System.out.println(cookieText); 
     } 
    }); 
    shell.setSize(400, 300); 
    shell.open(); 

    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
     { 
      display.sleep(); 
     } 
    } 

    display.dispose(); 
} 

Ale ja nie otrzymuję wartość cookie.

coś takiego: c# Get httponly cookie

+0

Próbowałem Twojego fragmentu z 'http: // stackoverflow.com /'. Wcześniej używałam inspektora Chromesa, aby zobaczyć, jakie pliki cookie są faktycznie wysyłane (w sumie 5). Ale widocznie SWT nie widzi ich wszystkich. Ten, którego nie można znaleźć, nazywa się "prov" i wygasa w 2055 roku. Te, które można zobaczyć, wygasają najpóźniej w 2018 roku. Może istnieje analogia do twojego JSESSIONID? –

Odpowiedz

2

Spróbuj znaleźć cookie z JavaScript zamiast metody Browser#getCookie(). Pracował dla mnie podczas mojego testu, ale nie wiem, swoją stronę, nie mogę przetestować go przed nim:

public static void main(String[] args) 
{ 
    Display display = new Display(); 

    Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new GridLayout()); 

    final Browser browser = new Browser(shell, SWT.NONE); 
    browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    final String url = "https://..."; 
    browser.setUrl(url); 

    /* Define the function to call from JavaScript */ 
    new BrowserFunction(browser, "cookieCallback") { 
     @Override 
     public Object function(Object[] objects) { 

      Object[] keyValuePairs = (Object[]) objects[0]; 

      for(Object keyValue : keyValuePairs) 
      { 
       Object[] pair = (Object[]) keyValue; 

       if(Objects.equals("JSESSIONID", pair[0])) 
        System.out.println(pair[1]); 
      } 

      return null; 
     } 
    }; 

    Button button = new Button(shell, SWT.PUSH); 
    button.setText("Get cookie"); 
    button.addListener(SWT.Selection, new Listener() { 
     @Override 
     public void handleEvent(Event event) { 
      /* Get the cookie from JavaScript and then call the function */ 
      browser.execute("cookieCallback(document.cookie.split(';').map(function(x) { return x.trim().split('='); }));"); 
     } 
    }); 

    shell.setSize(400, 300); 
    shell.open(); 

    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
     { 
      display.sleep(); 
     } 
    } 

    display.dispose(); 
} 
+0

Nie otrzymuję JSESSIONID, ale otrzymuję inne szczegóły z pliku cookie, np. Cookie = true, itp. – happy

+0

@happy Jeśli po prostu wydrukujesz pliki cookie w pętli, to nie zawierają one pliku cookie? Czy możesz zweryfikować w przeglądarce, że plik cookie jest ustawiony? – Baz

+0

W rzeczywistej przeglądarce mogę zobaczyć JSESSIONID = ..., cookie = true, NSC_TMAA = .., NSC_TMAS = ..; Kiedy debuguję kod otrzymuję tylko cookie = true, NSC_TMAA = .., NSC_TMAS = ..; Zgaduję, że jest to problem z ustawieniem na httponly true. – happy

1

Jeżeli ciasteczko chcesz dostać jest oznaczony jako httpOnly wtedy nie będzie być w stanie uzyskać go w aktualnych wersjach SWT. Zobacz dyskusję na temat this bug.