2016-03-09 14 views
7

Voglio leggere JSESSIONID dal cookie org.eclipse.swt.browser.Browser. Provo ad aprire il browser dal plug-in Eclipse. Sto usando qui sotto frammentoCome leggere cookie da 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(); 
} 

Ma io non sto ottenendo valore del cookie.

Qualcosa di simile a questo: c# Get httponly cookie

+0

Ho provato il tuo snippet con 'http: // stackoverflow.com /'. Prima ho usato l'ispettore Chromes per vedere quali sono i cookie effettivamente inviati (5 in tutto). Ma a quanto pare SWT non può vederli tutti. Quello che non è stato trovato si chiama 'prov' e scade nel 2055. Quelli che possono essere visti scadono nel 2018 più tardi. Forse c'è un'analogia con il tuo JSESSIONID? –

risposta

2

provare a ottenere il cookie di JavaScript anziché il metodo Browser#getCookie(). Ha funzionato per me durante la mia prova, ma come io non conosco il tuo sito web, non posso testarlo contro di essa:

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

Non ricevo JSESSIONID ma ottengo altri dettagli da cookie come cookie = true, ecc. – happy

+0

@happy Se si stampano i cookie nel ciclo, non contiene il cookie? Puoi verificare in un browser reale che il cookie è impostato? – Baz

+0

Nel browser reale posso vedere JSESSIONID = ..., cookie = true, NSC_TMAA = .., NSC_TMAS = ..; Quando eseguo il debug del codice ottengo solo cookie = true, NSC_TMAA = .., NSC_TMAS = ..; Immagino sia il problema di httponly impostato su true. – happy

1

Se il cookie si desidera ottenere è contrassegnato come httpOnly allora non sarà essere in grado di ottenerlo nelle attuali versioni SWT. Vedi this bug per una discussione.

Problemi correlati