Browser back按钮如何处理自动URL重定向?

时间:2013-01-05 10:20:54

标签: java url browser javafx url-redirection

我正在尝试创建一个浏览器,以便在JavaFX上练习。我用Stack实现了Back按钮。

  1. 当页面的URL发生变化时,将url添加到Stack(java.util.Stack)
  2. 按下后退按钮时,从Stack弹出1项并显示页面
  3. 但是这在URL重定向的情况下不起作用。例如。我输入http://www.google.com,它会自动重定向到http://www.google.co.in(印度)。这使得Stack中的2个条目破坏了Back按钮逻辑,因为页面是相同的但是从不同的位置获取。

    请协助我解决这个问题。

    感谢您的帮助

    webEngine.locationProperty().addListener(new ChangeListener<String>(){
    
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                //urlField is a text Field
                urlField.setText(newValue);
                addURLToStack(oldValue);
                if(backButtonStack.size() ==1){ //means on last url of Stack
                    backButton.setDisable(true);
                }
                else{
                    backButton.setDisable(false); 
                }}      
        });
     backButton.setOnMouseClicked(new EventHandler<MouseEvent>(){
    
            @Override
            public void handle(MouseEvent event) {
                if(backButtonStack != null && !backButtonStack.isEmpty()){
                    String poppedURL = backButtonStack.pop();
                    webEngine.load(poppedURL);
    
                }
            }
    
        });
    private void addURLToStack(String url) {
        if(backButtonStack == null){
            backButtonStack = new Stack<String>();
        }
    
        backButtonStack.push(url);
    }
    

3 个答案:

答案 0 :(得分:2)

您无需解决此问题。

JavaFX WebEngine有一个WebHistory对象,其中包含完全管理历史记录所需的所有API,并且应该注意不要为您重定向路径添加重定向的URL。而且,如果您不想使用它,可以使用webengine.executeScript("history.back()");让引擎的JavaScript引擎为您处理导航。

Chris Gerken所说的关于监控http状态返回代码以确定是否将对象放入历史记录是正确的。 JavaFX WebEngine中存在的困难是http状态返回码发生在网络层,不通过WebEngine接口公开。因此,如果您只是在监视WebEngine的位置属性,那么获得高质量的导航界面将非常困难。我在实现JavaFX WebBrowser以获得JavaFX体验时发现了这一点,my browser's history mechanism using an ObservableList with a current index pointer与您在问题中指出的问题完全相同。如果我今天要再次实现相同的功能,我只会使用后来的JavaFX版本提供的新WebHistory功能,而不是自己编写。

答案 1 :(得分:0)

我觉得您需要处理逻辑中的重定向。每当重新指示发生时;不要将原始URL放在数据结构中(堆栈或LinkedQueue);只在数据结构中放入最终的URL。当2-3次重定向发生时,您甚至可能面临条件。你需要把它变成通用的。

答案 2 :(得分:0)

只在您的堆栈中放入您实际显示的URL。在发送重定向上,您将获得状态代码307以及新URL。只把那个URL放在你的堆栈中(除非有一些奇怪的机会你又得到了另一个307 ...但你得到了这个想法)。

你可能想要使用列表而不是堆栈。这将让你前进和后退。您可能还需要保留其他内容,例如使用的HTTP谓词等。