再一次在这里我提出了一个关于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;
}
现在出现了问题,我在MenuAction上通过ApplicationContext.xml上的以下xml片段注入了一个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
通过这样做,我需要使用私有成员实现会话集 .... 私人地图会话; .... @覆盖 public void setSession(Map 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填充Menu并返回SUCESS,否则它将返回INPUT,这将导致登录屏幕。
提前致谢。
答案 0 :(得分: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>
我现在能够正确使用会话。