使用Interceptorvalidation用户访问权限

我试图使用Interceptor来限制用户执行某些操作。

ContainsKeyInterceptor

 public class ContainsKeyInterceptor extends AbstractInterceptor implements SessionAware { private static final long serialVersionUID = 1L; private Map session; @Override public String intercept(ActionInvocation actionInvocation) throws Exception { if(session == null) { System.out.println("session is null"); } if(session.containsKey("currentId")) { return "index"; } String result = actionInvocation.invoke(); return result; } @Override public void setSession(Map session) { this.session = session; } } 

如果在session找到currentId ,则应该将用户重定向到索引页面。

但是,我得到一个NullPointerException ,说session是null,由if-checkvalidation。

struts.xml

            /index.jsp /index.jsp    /index.jsp /login.jsp /index.jsp       index     

为什么session null以及如何解决?

( 这是我用的参考。)

Struts Session只是一个Map包装底层的HttpSession

虽然实现SessionAware接口是在Action中获取它的正确方法,但是如果要从Interceptor中获取它,则需要执行以下操作:

获取Struts 会话映射

 @Override public String intercept(ActionInvocation ai) throws Exception { final ActionContext context = ai.getInvocationContext(); // Struts Session Map session = context.getSession(); 

要获得真正的HttpSession对象

 @Override public String intercept(ActionInvocation ai) throws Exception { final ActionContext context = ai.getInvocationContext(); HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST); // Http Session HttpSession session = request.getSession(); 

也就是说,你没有在你的动作中获得会话(也没有任何其他参数,对象等)的原因是因为你遇到了一个常见错误: 只应用一个拦截器 (你的)而不是应用整个拦截器堆栈 (应该包含你的):

您可以在每个操作中定义两次:

     

或者更好的是,在自定义堆栈中定义一次,并始终使用堆栈:

         

并最终使用default-interceptor-ref定义它,以避免为该包的每个操作配置编写它:

   

基于此,我不认为拦截器本身可以/需要会话感知。

您可以这样访问此属性:

 final ActionContext context = actionInvocation.getInvocationContext(); this.session = context.getSession(); 

可能有一种方法可以自动获取此设置,我对struts2不太熟悉,但可能是sessionaware仅适用于特定的对象子集,并且由于某种原因,此拦截器不是其中之一。 (未被扫描,被排除在扫描之外,类型错误)