日期:2014-05-20  浏览次数:20691 次

struts2拦截器AbstractInterceptor的问题
本帖最后由 javaltzh123 于 2013-11-25 17:44:32 编辑
环境:struts2 2.3.15 spring 3.2 hibernate 4
通过继承AbstractInterceptor对登陆进行拦截,但无法进行实例化登陆类(LoginLogoutAction.java),

struts.xml配置

<interceptor name="checkPrivilege" class="cn.rayton.struts2.interceptor.CheckPrivilegeInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="checkPrivilege"></interceptor-ref>
        <interceptor-ref name="paramsPrepareParamsStack"></interceptor-ref>
</interceptor-stack>
<!-- 配置默认要使用的拦截器栈,对本包中的Action都有效 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>



拦截器部分代码:

public class CheckPrivilegeInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 1L;

@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 打印出类名
System.out.println("Action:"+invocation.getAction().getClass().getName());  
//找到运行的ActionProxy对象,并打印其要运行的方法名  
System.out.println("Method:"+invocation.getProxy().getMethod());  
if (invocation.getAction() instanceof LoginLogoutAction) {
return invocation.invoke();
  }
             .........其他省略
         }
}

打印结果:

Action:com.sun.proxy.$Proxy32
Method:login


在原来环境 struts2 2.1.8 spring2 hibernate3中没问题,升级成struts2 2.3.15就出现这个问题,大家帮忙分析分析什么情况?
未升级之前打印出的结果为:
Action:LoginLogoutAction
Method:login



struts2 拦截器, AbstractInterceptor

------解决方案--------------------
建议你下载下对应版本的Structs源码,看下getAction()方法的实现是否使用的动态代理,另外也可以打下断点Debug跟踪下就能找出原因了