正如我在网站上被告知和发现的那样,只有在我的.xhtml
.
是否可以在没有任何 EL 表达式的情况下调用我的 bean?
我需要这个,因为我HomeController
正在调用一个方法来检查会话状态和我的home.xhtml
,并且现在不需要这个 bean。
您需要从不同的方向寻找解决方案。
如果您正在开发用户身份验证而不是使用容器管理的身份验证,那么您通常使用servlet 过滤器来检查用户是否登录。
servlet 过滤器可以像 servlet (like FacesServlet
) 一样映射到特定的 URL 模式。然后它将在与该 URL 模式匹配的每个请求上调用。您可以浏览过滤器中的请求/会话数据,然后通过继续过滤器链或发送重定向来相应地处理请求/响应。
您需要javax.servlet.Filter
相应地实现接口。doFilter()
这是假设您有一个@SessionScoped
托管 bean 应该如何实现该方法的启动示例LoginController
。JSF 将会话范围的托管 bean 存储为HttpSession
.
@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);
LoginController loginController = (LoginController) (session != null) ? session.getAttribute("loginController") : null;
if (loginController == null || !loginController.isLoggedIn()) {
response.sendRedirect(request.getContextPath() + "/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 模式,例如/app/*
.
@WebFilter("/app/*")
public class LoginFilter implements Filter {
// ...
}
如果login.xhtml
也被此 URL 模式覆盖并且您确实无法更改它,则更新它,然后按如下方式更改块if
:
if (!request.getRequestURI().endsWith("/login.xhtml") && (loginController == null || !loginController.isLoggedIn())) {
// ...
}