我的环绕通知如下:@Around( "execution(* com.*.execute(..))" )
public void actionLoginValidate( ProceedingJoinPoint jp ) {
ActionMapping mapping = (ActionMapping) jp.getArgs()[ 0 ];
HttpServletRequest request = (HttpServletRequest) jp.getArgs()[ 2 ];
HttpServletResponse response = (HttpServletResponse) jp.getArgs()[ 3 ];
String fromUrl = request.getRequestURL().toString();
String par = request.getQueryString();
if ( null != par && par.length() > 0 ) {
fromUrl = fromUrl + "?" + par;
}
try {
HttpSession session = request.getSession();
if ( null == session.getAttribute( "loginInfo" ) ) {
session.setAttribute( "fromUrl", fromUrl );
response.sendRedirect( "login.do" );
} else {
jp.proceed();
}
} catch ( Throwable e ) {
log.error( e.getMessage(), e.getCause() );
}
}
Action如下:
public class TestAction extends DispachAction {

@Override
public ActionForward test1( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response ) {
System.out.println( 11 );
return mapping.findForward( "succ" );
}
}
其中继承了我自定义的DispachAction,代码如下:
public class DispachAction extends DispatchAction {
@Override
public ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response )
throws Exception {
return super.execute( mapping, form, request, response );
}
}
struts-config.xml代码如下:
<action
      parameter="p"
      path="/test"
      type="org.springframework.web.struts.DelegatingActionProxy" >
      <forward name="succ" path="/error.jsp" />
     </action>
我在地址栏打入localhost/test/test.do?p=test1后,通知可以拦截到,并顺利跳转到login.do。当登陆成功后被通知拦截,然后跳至test1方法,在test1方法中使用return mapping.findForward( "succ" )无法跳转成功,页面空白,什么都不显示,请问这是怎么回事呢?

解决方案 »

  1.   

    没有报异常啊,路径肯定对,如果我不用环绕通知的话,是可以正常跳转的。
    我刚才又试了一下,用request.getRequestDispatch()和response.sendRedirect()是可以正常跳转的
    郁闷!
      

  2.   

    我好像知道问题所在了。用了环绕通知以后,目标方法执行完毕后,又跳回到通知体内继续往下执行了,用return mapping.findForward( "succ" )根本就跳不走。现在的问题是怎么才能不让它返回到通知体内呢,而是
    执行return mapping.findForward( "succ" )跳回到页面呢?
      

  3.   

    我没有想要传值啊,只是想要他跳回页面!
    以前打算用前置通知来做。按我现在的思路来做的话,在前置通知中检查如果没有登陆的话,应该直接跳至登陆
    页面,不再执行目标方法。但事实是登陆页面也跳回了,目标方法也执行了。后来才改用的环绕通知。怎么才能
    阻止前置通知去执行目标方法呢?
    见我前面的贴子:
    http://topic.csdn.net/u/20081117/15/cbe635f7-12e8-4f86-8b0d-eb1f0216a481.html
      

  4.   

    你自定义的DispatchAction返回的super.execute(...),等于还是用它的DispatchAction,spring里的AOP默认只拦截Action(的execute)而不是DispatchAction(xxxx方法),要拦截DispatchAction里的自定义方法,必须自己重写DeletegatingRequestProccesor类
      

  5.   

    是啊,我自定义的DispatchAction虽然最终还要调用spring的DispatchAction,但他确实实现了我需要的功能,AOP能够拦截到自定义的DispatchAction.这样的话,我就可以进行权限的验证,验证通过后还会执行相应的方法。
      

  6.   

    请问一下,我的jp.getArgs().lenth 怎么是0啊