如何在PhaseListener中检索会话范围的托管bean?

时间:2012-09-15 15:58:37

标签: jsf jsf-2 session-scope phaselistener

我在设置授权监听器(实现PhaseListener)以管理身份验证和自动化方面遇到了麻烦。

更具体地说,我设置了一个名为SessionBean的会话范围bean:

@ManagedBean
@SessionScoped
public class SessionBean{

   private String loggedUser;

   public SessionBean(){
    logger.info("Sono nel costruttore di SessionBean()");
   }
   public String login(){
       ....
   }
   ...
}

在我的sun-web.xml中:

  <managed-bean>
    <managed-bean-name>SessionBean</managed-bean-name>
    <managed-bean-class>it.uniroma3.acme.auction.bean.SessionBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

在login()中我对用户名/密码进行控制,如果成功,我设置“loggedUser”。

我的AuthorizationListener是:

public class AuthorizationListener implements PhaseListener {

    private String currentUser;

    private SessionBean sessionBean;

    public void afterPhase(PhaseEvent event) {
        SessionBean sessionBean = (SessionBean)event.getFacesContext().getExternalContext().getSessionMap().get("SessionBean");
        String currentUser = sessionBean.getLoggedUser();

        if (sessionBean != null) {
            ...
               String currentUser = sessionBean.getLoggedUser();
        }
            else {
                 ...
            }
    }

    ...
}

在sun-web.xml中:

 <!-- Authentication and authorization block starting -->
    <lifecycle>
        <phase-listener>AuthorizationListener</phase-listener>
    </lifecycle>
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>login.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
  <!-- Authentication and authorization block ending -->

但我收到一个空的pointe sessionBean.getLoggedUser()。因此,当AuthorizationListener检查用户时,仍未创建SessionBean。这就是为什么我添加了“如果SessionBean不存在,创建它并将其放在SessionMap中”,但仍然无效。

我没有被迫使用这种方法进行身份验证和授权,但我需要的是避免使用“session.setAttribute(”username“,username)。所以任何其他策略都应该是真正的apreciated。 谢谢, 安德烈

编辑:正如BalusC建议的那样,我编辑了afterPhase方法。仍然遇到麻烦,总是空的SessionBean。

1 个答案:

答案 0 :(得分:3)

@ManagedProperty仅适用于@ManagedBean个班级。您的PhaseListener不是。

您需要从会话地图手动获取它。

SessionBean sessionBean = (SessionBean) event.getFacesContext()
    .getExternalContext().getSessionMap().get("SessionBean");

请注意,在第一个HTTP请求中它仍然可以null

然而,常见的方法是为作业使用servlet Filter,而不是PhaseListener。会话范围的托管bean可用作会话属性。

SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");