这取决于您如何设置登录名。您似乎正在使用本地认证,其中将登录用户设置为会话范围的受管Bean的属性。因为使用Java
EE提供的容器管理登录名,已经考虑了防止访问受限页面。
假设你已经在某个URL模式,像所有的受限制的页面
/app/*,
/secured/*等和你的会话范围的bean已经被管理bean的名字
user,那么你可以使用一个过滤器的工作。实现以下
doFilter()方法:
@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); User user = (session != null) ? (User) session.getAttribute("user") : null; if (user == null || !user.isLoggedIn()) { response.sendRedirect("/login.xhtml"); // No logged-in user found, so redirect to login page. } else { chain.doFilter(req, res); // Logged-in user found, so just continue request. }}将此过滤器映射到覆盖受限页面的URL模式。
此外,您需要确保已禁用这些页面上的浏览器缓存,否则最终用户在注销后仍将能够从浏览器缓存中看到它们。您也可以为此使用过滤器。您甚至可以在同一过滤器中执行此操作。



