在这里,我再次提出了一个 s2 的问题,我是它的初学者,并且在查找示例时遇到了一些麻烦。
我正在构建一个依赖于登录的菜单服务,当用户在起始页输入时给出。登录后,我通过执行以下操作将用户对象存储到会话中:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
....
// verifica se o parametro do CPF veio no get e tenta logar o usuario
if (!StringUtils.isBlank(request.getParameter(USER_CPF_REQUEST))) {
if ( doLogin(request, session) ) {
return Action.SUCCESS;
}
然后是 doLogin 方法
Usuario usuario = getServico().buscar( Long.valueOf(cpf) );
//Caso o usuário exista, guarda na session
if (usuario != null){
session.setAttribute(USER_HANDLE, usuario);
return true;
}
现在问题来了,我通过 ApplicationContext.xml 上的以下 xml 片段在 MenuAction 上注入了一个 MenuBean
<bean id="menuService" class="br.com.autenticis.renacon.ejb.MenuBean" />
<bean id="menuAction" scope="prototype" class="br.com.autenticis.renacon.actions.MenuAction">
<constructor-arg ref="menuService" />
</bean>
menuAction 声明如下:
public class MenuAction extends ActionSupport implements Preparable, SessionAware
通过这样做,我需要使用私有成员实现会话集
private Map<String, Object> session;
....
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
所有方法的失败部分如下,会话对象在调试时为空:
public String execute() {
if ( session.containsKey( LoginInterceptor.USER_HANDLE) ){
Usuario u = (Usuario) session.get( LoginInterceptor.USER_HANDLE);
setMenu( servico.getMenuPerfil( u.getPerfil() ) );
return Action.SUCCESS;
}
return input();
}
有谁知道为什么?或如何实施?查看上面的代码,我需要登录用户的“Perfil”,如果会话包含用户对象的密钥我得到它,然后使用 perfil 通过 setter 填充菜单并返回 SUCESS,否则它'将返回 INPUT,这将导致登录屏幕。