我有问题。我想阻止用户在没有登录jsf2的情况下访问页面。当用户直接将受限制的页面URL写入浏览器时,他/她不应该看到该页面。就像上面的情况一样,他/她必须被重定向到登录页面。我该如何以编程方式执行此操作?
答案 0 :(得分:12)
这取决于您如何编程登录。您似乎正在使用自行开发的身份验证,其中您将登录用户设置为会话作用域托管bean的属性。因为Java EE提供了容器管理登录,所以已经考虑了阻止访问受限页面。
假设您在某个网址格式上拥有所有受限制的网页,例如/app/*
,/secured/*
等,并且您的会话范围bean具有托管bean名称user
,那么您可以使用filter来完成工作。在doFilter()
方法中实现以下内容:
@Override
public 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.
}
}
将此过滤器映射到涵盖受限页面的网址模式。
此外,您需要确保已禁用这些页面上的浏览器缓存,否则最终用户仍可以在注销后从浏览器缓存中看到它们。您也可以使用过滤器。你甚至可以在同一个过滤器中完成它。另请参阅Browser back button doesn't clear old backing bean values。
答案 1 :(得分:1)
您是否尝试过编写过滤器...您可以拦截所有呼叫,检查用户是否可以访问某个页面,如果没有,您可以将用户重定向到登录页面...