Struts2 Action 获取 Session 的几种方式及优缺点对比
在 Struts2 开发中,Action 往往需要访问底层的 Servlet 对象(如 Session、Request)。框架提供了多种途径,各有优劣。作为资深开发者,我们需要根据项目的可测试性和耦合度要求来选择合适的方案。
1. 使用 Aware 接口(推荐)
这是最符合 Spring 风格的做法,通过实现特定的 Aware 接口,让 Struts2 容器在调用 execute 方法前自动注入依赖。
核心思路
Action 类实现 SessionAware、ServletRequestAware 或 ServletResponseAware 接口,框架会自动调用对应的 setter 方法。
代码示例
package action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.SessionAware;
import java.util.Map;
public class MyAction extends ActionSupport implements SessionAware {
// 这个 Map 封装了 Servlet Session 中的属性
private Map<String, Object> sessionMap;
@Override
public void setSession(Map<String, Object> session) {
this.sessionMap = session;
}
public String execute() throws Exception {
// 直接操作 Map,无需强转 HttpSession
sessionMap.put("user", "admin");
return SUCCESS;
}
}
点评
- 优点:与 Servlet API 解耦,方便单元测试(Mock Map 即可),符合框架规范。
- 缺点:只能获取到 Map 形式的 Session,如果需要原生
HttpSession对象,需额外处理。
2. 使用 ActionContext 类
这是 Struts2 内部机制的直接体现,通过 ThreadLocal 获取当前请求上下文。

