限制用户在注销后无法返回

时间:2012-11-22 13:31:11

标签: jsf jsf-2 httpresponse logout restriction

我使用JSF 2.0创建了webapplication,我希望限制用户在注销后返回。

对于解决方案,我查看了Great BalusC answer并尝试了其他方法,但它无效。

我尝试的内容如下。

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

在bean中我有

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响应并将标头设置到其中。但它没有用。

知道我哪里错了吗?

1 个答案:

答案 0 :(得分:1)

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

您确实需要对这些限制页面的所有请求进行过滤,完全按照您找到的答案中所述。

另见:


对具体问题

无关,在无效之前操纵会话地图毫无意义。会话失效将隐式地清除整个映射(因为它基本上是指会话的属性)。只需删除您操作会话地图的行。

IOException上只有stdout的捕获量非常差。删除整个try-catch并将throws IOException添加到方法中。容器将使用错误页面处理它。