我在设置授权侦听器(实现 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 -->
但我收到一个空指针 sessionBean.getLoggedUser()。因此,当 AuthorizationListener 检查用户时,仍然没有创建 SessionBean。这就是为什么我添加了一个“如果 SessionBean 不存在,则创建它并将其放入 SessionMap”,但仍然无法正常工作的原因。
我没有被迫使用这种方法进行身份验证和授权,但我需要的是避免“session.setAttribute(“username”,username)。所以任何其他策略都会非常感激。谢谢,Andrea
编辑:正如 BalusC 所建议的,我编辑了 afterPhase 方法。始终为空的 SessionBean 仍然存在问题。