正如我在网站上被告知和发现的那样,我的bean只有在我的.xhtml
上有电话才能执行。
是否可以在没有任何EL表达式的情况下调用我的bean?
我需要这个,因为我的HomeController
正在调用一种方法来检查会话状态,并且在我的home.xhtml
上,并且暂时不需要使用此bean。
答案 0 :(得分:2)
您需要寻找不同方向的解决方案。
如果您正在使用用户身份验证而不是使用容器管理身份验证,那么您通常会使用servlet filter来检查用户是否已登录。
servlet过滤器可以像servlet(如FacesServlet
)一样映射到特定的URL模式。然后,将在匹配该URL模式的每个请求上调用它。您可以在过滤器中浏览请求/会话数据,然后通过继续过滤器链或通过发送重定向来相应地处理请求/响应。
您需要相应地实施javax.servlet.Filter
界面。这是一个启动示例,假设您拥有doFilter()
托管bean @SessionScoped
,应该如何实现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.
}
}
将此过滤器映射到覆盖受限页面的网址模式,例如/app/*
。
@WebFilter("/app/*")
public class LoginFilter implements Filter {
// ...
}
更新如果此网址格式也涵盖了login.xhtml
且您确实无法更改它,请按以下步骤更改if
块:
if (!request.getRequestURI().endsWith("/login.xhtml") && (loginController == null || !loginController.isLoggedIn())) {
// ...
}