如何在Struts 2拦截器中访问HttpSession?我是不是该?

时间:2011-09-14 11:58:57

标签: java struts2

我在Struts2中看到了拦截器的概念。我在Struts2的教程中看到了以下示例。

在此示例中,作者使用拦截器通过访问HttpSession来检查凭据,并检查其中的USER_KEY

访问拦截器本身的HttpSession是不是一个坏主意?我猜拦截器是Java EE编程中的简单servlet过滤器。

我觉得访问HttpSession的最佳位置是在Struts2的action类中。

如果我错了,请纠正我。

public class AuthorizationInterceptor extends AbstractInterceptor {

    private static final String USER_KEY = "user";

    public String intercept(ActionInvocation invocation) throws Exception {
        Map session = invocation.getInvocationContext().getSession();
        if (session.get(USER_KEY) == null) {
            addActionError(invocation, "You must be authenticated to access this page");
            return Action.ERROR;
        }

        return invocation.invoke();
    }

    private void addActionError(ActionInvocation invocation, String message) {
        Object action = invocation.getAction();
        if (action instanceof ValidationAware) {
            ((ValidationAware) action).addActionError(message);
        }
    }
}

2 个答案:

答案 0 :(得分:5)

从拦截器访问HttpSession非常好;不鼓励在行动中访问它。

通过拦截器控制访问是一个完美的用例。访问控制通常会影响大部分应用程序。在拦截器中隔离它可以使主线代码更清晰。拦截器是与会话等servlet规范工件接口的最合适的地方。

操作可以通过SessionAware interface访问会话属性。它只公开Map<String, Object>个属性。这使得操作与servlet规范分离,使测试更容易。

答案 1 :(得分:0)

如果你想在拦截器内访问真实HttpSession,你可以通过以下方式获取它:

HttpSession session = ServletActionContext.getRequest().getSession();

P.S。我知道,我的答案对你的问题来说太迟了,但它可能对其他人有所帮助,希望=)