简而言之,就是这样的情景:
浏览器后退按钮必须正常运行(我正在使用JSF 2.0,所以这样做有效)
注销后,如果用户点击后退按钮,应用必须将他/她重定向到登录页面(不工作,用户可以查看受保护的页面,虽然已过期。我不能包括meta标签禁用浏览器缓存,因为后退按钮停止工作)
如果用户通过单击按钮调用某个操作,则应在其中一个过期页面上将其重定向到登录或错误页面(不工作,该应用程序会抛出错误并显示空白页面我的ExceptionHandlerWrapper实现检测到异常并且正在使用NavigationHandler来更改viewId并呈现响应(faces-config上的“facesException”映射指向login.jsf),但应用程序的行为不符合预期)
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
浏览器后退按钮必须正常运行(我正在使用JSF 2.0,所以这样做有效)
注销后,如果用户点击后退按钮,应用必须将他/她重定向到登录页面(不工作,用户可以查看受保护的页面,虽然已过期。我不能包括meta标签禁用浏览器缓存,因为后退按钮停止工作)
解决此问题的两个步骤。
通过相应地设置响应标头来禁用浏览器缓存。您可以在映射到Filter
上的FacesServlet
中执行此操作。
HttpServletResponse hsr = (HttpServletResponse) response;
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.
chain.doFilter(request, response);
不要使用HTTP POST进行页面到页面的导航。始终使用HTTP GET进行页面到页面的导航。如果您需要提交表单,请让它提交给自己(即让操作方法返回null
或void
)并使用h:messages
或h:somecomponent rendered="#{success}"
来显示相同的结果页面有条件。
- 如果用户通过单击按钮调用某个操作,则应在其中一个过期页面上将其重定向到登录或错误页面(不工作,应用程序会抛出错误并显示空白页面。我的ExceptionHandlerWrapper实现检测到异常并且正在使用NavigationHandler来更改viewId并呈现响应(faces-config上的“facesException”映射指向login.jsf),但应用程序的行为不符合预期)
<error-page>
上的javax.faces.webapp.ViewExpiredException
已经足够了。另请参阅this answer。