我使用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响应并将标头设置到其中。但它没有用。
知道我哪里错了吗?
答案 0 :(得分:1)
您不是在受限制页面本身的响应上设置这些标题,而是仅在注销操作的响应中设置这些标题。因此限制页面本身仍然在浏览器缓存中,只有注销操作不在浏览器缓存中。但是,后退按钮不会转到注销操作,而是转到受限页面(因此仍然可以从浏览器缓存中提供)。
您确实需要对这些限制页面的所有请求进行过滤,完全按照您找到的答案中所述。
无关,在无效之前操纵会话地图毫无意义。会话失效将隐式地清除整个映射(因为它基本上是指会话的属性)。只需删除您操作会话地图的行。
IOException
上只有stdout的捕获量非常差。删除整个try-catch
并将throws IOException
添加到方法中。容器将使用错误页面处理它。