3

在这里,我再次提出了一个 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,这将导致登录屏幕。

4

1 回答 1

3

经过我们的一些尝试,我设法发现了错误。这不在程序中,而是在 struts.xml 中,我为应用程序编写了一个自定义堆栈:

<!-- stack seguro --> 
<!-- 
<interceptor-stack name="defaultLoginStack"> 
<interceptor-ref name="logger" /> 
<interceptor-ref name="params" /> 
<interceptor-ref name="login" /> 
<interceptor-ref name="prepare" /> 
<interceptor-ref name="chain" /> 
<interceptor-ref name="modelDriven" /> 
<interceptor-ref name="modelDriven" /> 
<interceptor-ref name="fileUpload" /> 
<interceptor-ref name="staticParams" /> 
<interceptor-ref name="params" /> 
<interceptor-ref name="conversionError" /> 
<interceptor-ref name="validation" /> 
<interceptor-ref name="workflow" /> 
</interceptor-stack> 
--> 

并且有点忘记包含与会话相关的项目,将 defaultLoginStack 更改为

<interceptor-stack name="defaultLoginStack"> 
<interceptor-ref name="login" /> 
<interceptor-ref name="defaultStack" /> 
</interceptor-stack>  

我现在可以正确使用会话注入。

于 2009-04-15T20:00:29.207 回答