0

正如我在网站上被告知和发现的那样,只有在我的.xhtml.

是否可以在没有任何 EL 表达式的情况下调用我的 bean?

我需要这个,因为我HomeController正在调用一个方法来检查会话状态和我的home.xhtml,并且现在不需要这个 bean。

4

1 回答 1

2

您需要从不同的方向寻找解决方案。

如果您正在开发用户身份验证而不是使用容器管理的身份验证,那么您通常使用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())) {
    // ...
}
于 2012-04-27T17:32:13.410 回答