0

我已经实现了一个 servlet 过滤器,它检查用户是否登录,如果没有,则将用户重定向到登录页面。我将此检查作为过滤器的原因是登录页面存在于另一个 web 应用程序中,我似乎无法重定向到使用 web.xml 的 FROM auth-method 重定向到具有不同上下文根的不同 web 应用程序中的页面(注意,我使用的是 weblogic 11g)。

我遇到的问题是,当我有一个 ajaxified 组件(如按钮)时,servlet 过滤器无法重定向用户。即他们回到他们所在的页面上。

我应该以不同的方式进行此登录检查吗?

4

1 回答 1

2

我将 servlet 过滤器重新实现为在 RESTORE_VIEW 阶段之前运行的 JSF 2.0 阶段侦听器。通过将逻辑移到 Phase Listener 中,我能够利用 JSF 处理 AJAX 请求重定向的能力。基本上,JSF 2.0 将创建正确的 AJAX 响应以在客户端引起重定向。需要明确的是,如果用户未登录,此机制能够对 AJAX 和非 AJAX 请求进行重定向。

具体来说,它将发回以下响应:

<?xml version="1.0" encoding="utf-8"?>
<partial-response>
  <redirect url="/contextpath/faces/ajax/redirecttarget.xhtml">
  </redirect>
</partial-response>"

相位监听器的代码:

public PhaseId getPhaseId() 
{
    return PhaseId.RESTORE_VIEW;
}

public void afterPhase(PhaseEvent event) 
{
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    HttpSession session = (HttpSession)ec.getSession(false);

    if (session==null || session.getAttribute(IS_LOGGED_IN_INDICATOR) == null) 
    {
        try
        {
            ec.redirect(LOGIN_PAGE_URL);
        }
        catch(IOException e)
        {
            // log exception...
        }           
    }
}
于 2012-05-04T19:34:48.937 回答