在加载每个页面之前进行一些检查并重定向到另一个页面

时间:2013-08-01 17:48:35

标签: java jsf jsf-2.2

我需要在每个页面加载之前进行一些检查,以查看是否需要将用户重定向到另一个页面(出于安全原因)。

当我使用JSF 2.0时,我使用了一个阶段监听器来完成这项工作。现在我正在使用JSF 2.2并且我的所有bean都不再是JSF bean了,但是CDI bean,我认为我提供了更好的选择(或者没有?)。

我听说过viewAction事件,但我不想在每个页面上重复元数据(只有在没有其他选项的情况下)。

那么在带有CDI的JSF 2.2中实现这种情况的最佳方法是什么?

更新(在@skuntsel建议之后)

这是我现在使用的过滤器。我想在验证后才使用它来简化代码。顺便说一句,如果你能看到任何错误,如果你告诉我,我将不胜感激。

@WebFilter("/*")
public class SolicitacoesFilter implements Filter
{
    // I can't just use @Inject private User _user, because it needs to be initialized
    // only when the user is authenticated. Otherwise an exception is thrown. If this
    // filter was called only after the authentication I could use the mentioned code.
    private User _user;

    @Inject
    private Instance<User> _userGetter;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        if (initializeUser(request))
        {
            if (_user.isProvisoryPassword())
            {
                // Redirect to another page...
                return;
            }
            if (_user.getStatus() != Status.ACTIVE)
            {
                // Redirect to another page...
                return;
            }
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy()
    {
    }

    private boolean initializeUser(ServletRequest request)
    {
        boolean userAuthenticated = ((HttpServletRequest) request).getUserPrincipal() != null;
        if (userAuthenticated)
        {
            if (_user == null)
            {
                _user = _userGetter.get();
            }
        }
        else
        {
            _user = null;
        }
        return _user != null;
    }
}

1 个答案:

答案 0 :(得分:0)

好的,重定向需求的目的是什么?

  • 如果是关于检查会话用户的身份验证,请使用过滤器:

我们假设http://www.domain.com/login.jsf有登录表单。 一旦用户触发连接按钮,我们希望将他重定向到http://www.domain.com/member/welcome.jsf,并避免其他人不访问member / welcome.jsf域,我的意思是http://www.domain.com/member/中的所有页面{3}} ....

这里有一个简单的设计:

@WebFilter("/member/*")  
public class SecurityCheck implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
    FilterChain chain) throws ServletException, IOException {

  HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession();

    if (session == null || session.getAttribute("User") == null) {
        response.sendRedirect(request.getContextPath() + "/index.xhtml"); // No logged-in user found, so redirect to login page.
    } else {
        chain.doFilter(req, res); // Logged-in user found, so just continue request.
    }

}

@Override
public void destroy() {
// Cleanup global variables if necessary.
}
  • 其他情况,请使用:

    <h:link></h:link>,or <h:commandLink></h:commandLink> // Checking in the managed Beans method
    
  • 您也可以使用xml文件进行重定向。