我在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);
}
}
}
答案 0 :(得分:5)
从拦截器访问HttpSession
非常好;不鼓励在行动中访问它。
通过拦截器控制访问是一个完美的用例。访问控制通常会影响大部分应用程序。在拦截器中隔离它可以使主线代码更清晰。拦截器是与会话等servlet规范工件接口的最合适的地方。
操作可以通过SessionAware
interface访问会话属性。它只公开Map<String, Object>
个属性。这使得操作与servlet规范分离,使测试更容易。
答案 1 :(得分:0)
如果你想在拦截器内访问真实HttpSession
,你可以通过以下方式获取它:
HttpSession session = ServletActionContext.getRequest().getSession();
P.S。我知道,我的答案对你的问题来说太迟了,但它可能对其他人有所帮助,希望=)