2017-03-05 15 views
2

私は現在javafxを試しています。私はそれを使ってWebブラウザを作ろうとしています。これまでのところ、きれいにうまくいっていますが、毎回すべてのページにログインする必要があります。だから、私はクッキーを使ってファイルの中に保存することにしたので、毎回ログインする必要はありません。 私はこれを過去5時間にわたって稼働させようとしてきましたが、毎回ログインする必要があります。これは私がこれまで持っているものです。永続的なクッキーを保存しています

public class Main extends Application { 

public static void main(String[] args) { 
    if (!Values.SRCFILE.exists()) { 
     Installation.launch(Installation.class, args); 
     return; 
    } 

    launch(args); 
} 

private Stage stage; 
private GridPane pane; 

private List<BrowserTab> tabs; 

@FXML 
private TabPane tabPane; 

@FXML 
public void initialize() { 
    tabs = new ArrayList<>(); 

    CookieManager manager = new CookieManager(); 
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
    CookieHandler.setDefault(manager); 

    Map<String, List<String>> map = new HashMap<>(); 
    URI uri = null; 

    try { 
     for (String line : Files.readAllLines(Values.COOKIESFILE.toPath())) { 
      String[] values = line.split("\\|"); 
      URI newUri = new URI(values[0]); 

      if (uri == null) 
       uri = newUri; 

      if (!uri.equals(newUri)) { 
       CookieHandler.getDefault().put(uri, map); 
       uri = newUri; 
       System.out.println(map); 
       map = new HashMap<>(); 
      } 

      String[] actualValues = values[1].split(":"); 

      map.put(actualValues[0], Arrays.asList(actualValues[1].split(";"))); 
     } 

     if (uri != null) 
      CookieHandler.getDefault().put(uri, map); 
    } catch (IOException | URISyntaxException e) { 
     e.printStackTrace(); 
    } 

    System.out.println(map); 

    stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
     @Override 
     public void handle(WindowEvent event) { 
      if (tabs.size() > 1) { 
       Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
       alert.setTitle("Closing window"); 
       alert.setHeaderText(""); 
       alert.setContentText("Are you sure you want to close this window? Doing so will close all open tabs"); 
       alert.showAndWait(); 
      } 

      //save cookies 
      CookieStore store = ((CookieManager) CookieHandler.getDefault()).getCookieStore(); 
      try { 
       Files.write(Values.COOKIESFILE.toPath(), ("").getBytes(), StandardOpenOption.TRUNCATE_EXISTING); 

       for (URI uri : store.getURIs()) { 
        Map<String, List<String>> map = CookieHandler.getDefault().get(uri, new HashMap<>()); 

        Files.write(Values.COOKIESFILE.toPath(), (uri + "|").getBytes(), StandardOpenOption.APPEND); 

        for (String value : map.keySet()) { 
         Files.write(Values.COOKIESFILE.toPath(), (value + ":").getBytes(), StandardOpenOption.APPEND); 

         for (String line : map.get(value)) 
          Files.write(Values.COOKIESFILE.toPath(), (line + ";").getBytes(), StandardOpenOption.APPEND); 

         Files.write(Values.COOKIESFILE.toPath(), ("\n").getBytes(), StandardOpenOption.APPEND); 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    addTab(); 
} 

@Override 
public void start(Stage primaryStage) { 
    this.stage = primaryStage; 
    stage.setTitle("Browser"); 

    try { 
     // Load person overview. 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setController(this); 
     loader.setLocation(Main.class.getResource("/browser.fxml")); 
     pane = loader.load(); 

     Scene scene = new Scene(pane); 
     stage.setScene(scene); 
     stage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void setURL(String url) { 
    tabs.get(tabPane.getSelectionModel().getSelectedIndex()).setURL(url); 
} 

public void search(String text) { 
    tabs.get(tabPane.getSelectionModel().getSelectedIndex()).search(text); 
} 

void addTab() { 
    BrowserTab browserTab = new BrowserTab(this); 
    browserTab.setText("Loading..."); 
    browserTab.setURL("https://google.com/"); 

    tabs.add(browserTab); 

    browserTab.setOnClosed(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 
      tabs.remove(browserTab); 

      if (tabPane.getTabs().isEmpty()) 
       Platform.exit(); 
     } 
    }); 
    tabPane.getTabs().add(browserTab); 
} 

そして、私のBrowserTabクラス

public class BrowserTab extends Tab { 

private Main main; 

private GridPane pane; 

@FXML 
private WebView webView; 
@FXML 
private TextField urlField; 
@FXML 
private Button backButton; 
@FXML 
private Button forwardButton; 
@FXML 
private Button goButton; 
@FXML 
private Button addTabButton; 

public BrowserTab(Main main) { 
    this.main = main; 

    try { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setController(this); 
     loader.setLocation(getClass().getResource("/tab-template.fxml")); 

     setContent(loader.load()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    initialize(); 
} 

@FXML 
public void initialize() { 
    webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 
     @Override 
     public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { 
      if (newState == Worker.State.SUCCEEDED) { 
       String title = webView.getEngine().titleProperty().getValue(); 

       if (title == null || title.trim().isEmpty()) 
        title = webView.getEngine().getLocation(); 

       setText(title); 
       urlField.setText(webView.getEngine().getLocation()); 
      } 
     } 
    }); 

    backButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      WebHistory history = webView.getEngine().getHistory(); 

      history.go(-1); 

      int index = history.getCurrentIndex(); 

      if (index + 1 > history.getEntries().size() - 1) 
       forwardButton.setDisable(true); 
      else 
       forwardButton.setDisable(false); 

      if (index - 1 < 0) 
       backButton.setDisable(true); 
      else 
       backButton.setDisable(false); 
     } 
    }); 

    forwardButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      WebHistory history = webView.getEngine().getHistory(); 

      history.go(1); 

      int index = history.getCurrentIndex(); 

      if (index + 1 > history.getEntries().size() - 1) 
       forwardButton.setDisable(true); 
      else 
       forwardButton.setDisable(false); 

      if (index - 1 < 0) 
       backButton.setDisable(true); 
      else 
       backButton.setDisable(false); 
     } 
    }); 

    urlField.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent event) { 
      if (event.getCode() == KeyCode.ENTER) 
       goButton.fire(); 
     } 
    }); 

    goButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      String url = urlField.getText(); 

      if (!url.contains(".")) { 
       search(url); 
       return; 
      } 

      if (!(url.startsWith("http://") || url.startsWith("https://"))) 
       url = "http://" + url; 

      setURL(url); 
     } 
    }); 

    webView.getEngine().getHistory().getEntries().addListener(new ListChangeListener<WebHistory.Entry>() { 
     @Override 
     public void onChanged(Change<? extends WebHistory.Entry> c) { 
      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        int index = webView.getEngine().getHistory().getCurrentIndex(); 

        System.out.println(index); 

        if (index + 1 > c.getList().size() - 1) 
         forwardButton.setDisable(true); 
        else 
         forwardButton.setDisable(false); 

        if (index - 1 < 0) 
         backButton.setDisable(true); 
        else 
         backButton.setDisable(false); 
       } 
      }); 
     } 
    }); 

    addTabButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      addTab(); 
     } 
    }); 
} 

public void setURL(String url) { 
    webView.getEngine().load(url); 
} 

public void search(String text) { 
    webView.getEngine().load("https://google.com/search?q=" + text); 
} 

private void addTab() { 
    main.addTab(); 
} 

ファイルのフォーマットは次のようになります。

uri1|value:string1;string2;string3; 
uri2|value:string1;string2;string3; 

すべてのヘルプは本当にいただければ幸いです。

+0

を参照してください:[JavaFXの者WebEngine/WebViewのを使ってクッキーを設定](http://stackoverflow.com/questions/14385233/cookieを使用したjavafxs-webengine-webviewの設定)。 – jewelsea

+0

@jewelsea CookieManagerの使い方について説明していますが、私の主な問題は、Cookieがファイルから読み込まれCookieManagerに置かれるとWebViewがそれらを無視するように見えることです。ファイルからロードしていないときにCookieが正しく保存されていることを確認します。アプリケーションで新しいタブを開いたときにログインしているためです。 – stefvanschie

+0

実際には、「java.net.CookieManagerとjava.net.CookieStoreを使用しようと時間を無駄にしないでください。間違った標準を実装しているため、多くのサイトで問題が発生する可能性があります。とにかく、私はあなたの質問や関連する質問を詳しく見ていないので、おそらくそれはあなたには役に立たない。あなたの問題に幸運。 – jewelsea

答えて

2

もう少し掘り下げてみたら解決策が見つかりました。 問題は、マップ内のデフォルトの文字列(キー要素)が常に「Cookie:」であることです。ただし、実際にCookieHandlerに追加するためにマップを作成するときは、 'Set-Cookie'または 'Set-Cookie2'のいずれかにする必要があります。これらのいずれかでない場合は、値をスキップしてクッキーがまったくなくなります。また、CookieManagerといくつかのメソッドを使用してクッキーを文字列に変換したり、その逆を行ったりしました。 CookieManagerを作成するときは、2つのパラメータ(cookiestoreとcookiepolicy)でコンストラクタを選択し、パラメータがゼロでないコンストラクタを選択するように注意する必要があります。パラメタがゼロのものを選択すると、cookiestoreが作成されず、エラーが発生します。 2つのパラメータを持つものを使用する場合は、ストアをnullのままにしておくと、ストアが作成されます。これは私が使用して終了するものである:

省:

CookieStore store = ((CookieManager) CookieHandler.getDefault()).getCookieStore(); 
try { 
    Files.write(Values.COOKIESFILE.toPath(), ("").getBytes(), StandardOpenOption.TRUNCATE_EXISTING); 

    for (URI uri : store.getURIs()) { 
    Map<String, List<String>> map = CookieHandler.getDefault().get(uri, new HashMap<>()); 

    Files.write(Values.COOKIESFILE.toPath(), (uri + "|Cookie:").getBytes(), StandardOpenOption.APPEND); 

    for (HttpCookie cookie : store.get(uri)) { 
     if (cookie.hasExpired()) 
     continue; 

     Files.write(Values.COOKIESFILE.toPath(), (CookieUtil.toString(cookie) + "~").getBytes(), StandardOpenOption.APPEND); 
    } 

    Files.write(Values.COOKIESFILE.toPath(), "\n".getBytes(), StandardOpenOption.APPEND); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

ロード:

CookieManager manager = new CookieManager(null, CookiePolicy.ACCEPT_ALL); 

try { 
    for (String line : Files.readAllLines(Values.COOKIESFILE.toPath())) { 
    String[] values = line.split("\\|"); 
    URI uri = new URI(values[0]); 

    String[] actualValues = values[1].split(":"); 

    if (actualValues.length < 2) 
     continue; 

    for (String header : actualValues[1].split("~")) 
     manager.getCookieStore().add(uri, CookieUtil.fromString(header)); 
    } 
    } catch (IOException | URISyntaxException e) { 
    e.printStackTrace(); 
    } 

CookieHandler.setDefault(manager); 
関連する問題