我在设置授权监听器(实现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。答案 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");