Struts 6.0.0会话失效错误处理及会话管理方案求助
Struts 6.0.0 会话处理问题修复及正确方案
原代码的问题分析
你的代码存在两个核心问题,直接导致调用invalidate()时抛出异常:
- 对象不一致:你将
getServletRequest().getSession(false)赋值给session变量,但判断条件却是null != getSession()——这两个调用获取的会话对象可能不一致,当session变量为null但getSession()返回有效会话时,执行session.invalidate()就会触发空指针异常。 - 生命周期操作不严谨:直接操作原生
HttpSession时,没有严格校验会话对象的有效性,失效后重新获取会话的逻辑也没有和Struts的上下文同步。
正确处理方案及代码示例
方案1:规范操作原生HttpSession
如果坚持使用原生HttpSession,需确保会话对象的一致性和有效性校验:
if (null == mode) { // 统一获取会话对象,避免多次调用返回不一致结果 HttpSession session = getServletRequest().getSession(false); log.debug("当前会话: {}", session); // 仅当会话存在时执行失效操作 if (session != null) { session.invalidate(); } // 创建新会话,此时会生成全新的会话ID session = getServletRequest().getSession(true); } // 从新会话中获取用户信息 userVO = (UserVO) session.getAttribute("USER_INFO");
方案2:使用Struts 6推荐的SessionMap(更符合框架规范)
Struts 6提供了SessionMap来封装会话操作,它和Struts的ActionContext深度绑定,能更好地处理会话生命周期:
import org.apache.struts2.dispatcher.SessionMap; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; // 实现SessionAware接口,让Struts注入SessionMap public class YourAction extends ActionSupport implements SessionAware { private SessionMap<String, Object> sessionMap; @Override public void setSession(Map<String, Object> session) { this.sessionMap = (SessionMap<String, Object>) session; } public String execute() { if (null == mode) { // 检查会话是否存在,且未被失效 if (sessionMap != null && !sessionMap.isEmpty()) { // 调用Struts的失效方法,自动同步原生HttpSession sessionMap.invalidate(); } // 重新获取会话,Struts会自动创建新的SessionMap sessionMap = (SessionMap<String, Object>) ActionContext.getContext().getSession(); } // 从SessionMap中获取用户信息 userVO = (UserVO) sessionMap.get("USER_INFO"); return SUCCESS; } }
关键注意事项
- 避免混合使用
getSession()(Struts Action的方法)和getServletRequest().getSession(),二者获取的会话对象虽然底层关联,但框架层面的处理逻辑不同,容易引发一致性问题。 - 会话失效后,所有旧会话中的属性都会被清空,新会话需要重新设置用户信息,否则
userVO会为null。
内容的提问来源于stack exchange,提问作者vikas
相关产品推荐
相关产品推荐

