【问题标题】:How does Browser back button handle Automatic URL redirection?浏览器后退按钮如何处理自动 URL 重定向?
【发布时间】:2012-12-19 16:47:31
【问题描述】:

我正在尝试创建一个浏览器来实践 JavaFX。我用 Stack 实现了 Back 按钮。

  1. 当页面的URL发生变化时,将url添加到Stack(java.util.Stack)
  2. 按下后退按钮时,从 Stack 中弹出 1 项并显示页面

但这在 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);
}

【问题讨论】:

  • 不要使用 java.util.Stack,它已被弃用!使用 LinkedList 和它的接口 Deque。 docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html
  • 感谢您的信息,但即使我使用链表,我原来的问题仍然存在。额外的值将被添加到链接列表而不是自动 URL 重定向中的堆栈
  • 你能添加一些你的代码吗?我想你的问题很容易理解
  • webEngine.locationProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue extends String> observable, String oldValue, String newValue) { //urlField 是一个text Field urlField.setText(newValue); addURLToStack(oldValue); if(backButtonStack.size() ==1){ //表示堆栈的最后一个 url backButton.setDisable(true); } else{ backButton.setDisable(false) ; }} });
  • No-no-no!=) 将此代码添加到您的问题中,并将其放入标记“代码”中!)

标签: java url browser javafx url-redirection


【解决方案1】:

你不需要解决这个问题。

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 功能,而不是自己编写。

【讨论】:

    【解决方案2】:

    我觉得您需要在逻辑中处理重定向。每当重定向发生时;不要将原始 URL 放在您的数据结构中(堆栈或 LinkedQueue 等等);仅将最终 URL 放入您的数据结构中。当发生 2-3 次重定向时,您甚至可能会遇到一些情况。您需要使其通用。

    【讨论】:

      【解决方案3】:

      仅将您实际显示的 URL 放入您的堆栈。在发送重定向时,您将返回 307 状态代码以及新 URL。只将该 URL 放入您的堆栈中(除非您有一些奇怪的机会获得另一个 307 回复……但您明白了)。

      您可能希望使用列表而不是堆栈。这将使您前进和后退。您可能还需要掌握其他内容,例如使用的 HTTP 动词等。

      【讨论】:

        猜你喜欢
        • 2013-01-10
        • 2023-02-23
        • 2018-06-02
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 2020-09-12
        • 2014-08-14
        • 1970-01-01
        相关资源
        最近更新 更多