1

我已经使用 JSF 2.0 创建了 web 应用程序,我想限制用户在注销后返回。

对于解决方案,我查看了Great BalusC 的答案并尝试了其他方法,但它不起作用。

我尝试如下。

<h:commandLink value="logout" action="#{bean.makeMeLogut()}" />

在豆里我有

public void makeMeLogut() {
    try {
        // get response from JSF itself instead of coming from filter.
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("isLoggedIn", "false");
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        HttpServletResponse hsr = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        hsr.setDateHeader("Expires", 0); // Proxies.
        FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
    } catch (IOException ex) {
        System.out.println("can't logut...");
    }
}

根据 BalusC 的回答,我需要创建过滤器,但是我想使用 JSF 响应并在其中设置标题。但是它不起作用。

知道我哪里出错了吗?

4

1 回答 1

1

您没有在受限页面本身的响应中设置这些标头,而只是在注销操作的响应中设置这些标头。所以限制页面本身还在浏览器缓存中,只是注销动作不在浏览器缓存中。但是,后退按钮不会转到注销操作,而是转到受限制的页面(因此仍然从浏览器缓存中提供)。

您确实需要对这些受限页面的所有请求进行过滤,正如您找到的答案中所述。

也可以看看:


与具体问题无关,在失效之前操作会话映射是没有意义的。会话失效将隐含地清除整个映射(因为它基本上是指会话的属性)。只需删除您在其中操纵会话映射的行。

此外,仅执行标准输出的捕获IOException率也非常差。删除整个try-catch并添加throws IOException到方法中。容器将使用错误页面处理它。

于 2012-11-22T13:38:21.163 回答