有没有办法以编程方式检测用户何时按下浏览器中的F5按钮?

时间:2014-09-25 10:41:23

标签: jsf jsf-2

我有一个缓存,当用户在浏览器中发出F5请求时,我想让它无效。我正在运行JSF 2.0应用程序。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:3)

使用FacesContext.getCurrentInstance().isPostBack()检查页面请求是否是同一页面的重新加载。理想的选择是<f:viewAction/>(新的JSF-2.2)或preRenderView事件。

  1. 定义支持bean方法

    public static boolean isPostback() {
       return FacesContext.getCurrentInstance().isPostback();
    } 
    
  2. 使用

    • <f:viewAction/>

      <f:metadata>
           <f:viewAction action="#{bean.isPostBack}" onPostBack="true"/>
      </f:metadata>
      
    • f:event

      <f:metadata>
           <f:event type="preRenderView" listener="#{bean.isPostBack}"/>
      </f:metadata>
      

  3. 您可以完全跳过整个支持bean isPostBack检查,直接从页面直接执行缓存清除方法。

    • <f:viewAction/>

          <f:metadata>
               <f:viewAction action="#{bean.clearCache}" rendered="#{facesContext.postBack}" onPostBack="true"/>
          </f:metadata>
      
    • f:event

          <f:metadata>
               <f:event type="preRenderView" rendered="#{facesContext.postBack}" listener="#{bean.clearCache}"/>
          </f:metadata>
      

    这种方法的好处是您可以编写更少的代码,并且当请求回发时,您的缓存清除机制仍然只执行

答案 1 :(得分:1)

我认为这有助于您按键代码检测任何按键。

请参阅此链接以获取密钥代码。 https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ui/Keyboard.html

<rich:hotKey key="f5" onkeydown="if (event.keyCode == 116) return false;" handler="return false;" disableInInput="true" />
<rich:hotKey key="ctrl+R" onkeydown="if (event.keyCode == 123) return false;" handler="return false;" disableInInput="true" />
<rich:hotKey key="ctrl+f5" onkeydown="if (event.keyCode == 154) return false;" handler="return false;" disableInInput="true" />

答案 2 :(得分:0)

我已在the BootsFaces demo collection on GitHub上传了一个正在运行的F5探测器项目并写为a short blog post。基本上,Kolossus的答案是正确的。 ViewAction也会在第一页加载时触发,所以我添加了几行来检测它。

答案 3 :(得分:0)

我找到了在beyondjava上实现的解决方案

<f:metadata>
   <f:viewAction action="#{f5Detector.checkF5}" onPostBack="true"/>
</f:metadata>

Java类(只是将ManagedBean更改为Named)

import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@SessionScoped
@Named
public class F5Detector {
    private String previousPage = null;

    public void checkF5() {
        String msg = "";
        UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
        String id = viewRoot.getViewId();
        if (previousPage != null && (previousPage.equals(id))) {
            // It's a reload event
        }
        previousPage = id;
    }
}