如何提供没有EL表达式的bean方法

时间:2012-04-27 17:23:47

标签: jsf el

正如我在网站上被告知和发现的那样,我的bean只有在我的.xhtml上有电话才能执行。

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

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

1 个答案:

答案 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())) {
    // ...
}
相关问题