2015-01-02 2 views
0

У меня есть два перехватчика, определенные в отдельных пакетах.Перехватчик не вызывается, но выполняет в любом случае?

Одним из них является «позитивным» (проверяет sessioncurrentId содержит) и другие «не-утвердительные» (чеки, если session не содержит currentId).

struts.xml:

<!-- actions available to guests --> 
<package name="guest" extends="struts-default"> 
    <interceptors> 
     <interceptor name="containskey" class="com.mypackage.interceptor.ContainsKeyInterceptor" /> 
    </interceptors> 

    <action name="index" class="com.mypackage.action.IndexAction"> 
     <interceptor-ref name="defaultStack" /> 
     <interceptor-ref name="containskey" /> 
     <result type="redirect">/index.jsp</result> 
     <result name="index" type="redirect">/index.jsp</result> 
    </action> 

    <action name="login" class="com.mypackage.action.LoginAction"> 
     <interceptor-ref name="defaultStack" /> 
     <interceptor-ref name="containskey" /> 
     <result type="redirect">/index.jsp</result> 
     <result name="input">/login.jsp</result> 
     <result name="index" type="redirect">/index.jsp</result> 
    </action> 
</package> 

<!-- actions available to members --> 
<package name="member" extends="struts-default"> 
    <interceptors> 
     <interceptor name="notcontainskey" class="com.mypackage.interceptor.NotContainsKeyInterceptor" /> 
    </interceptors> 

    <action name="changepassword" class="com.mypackage.action.ChangePasswordAction"> 
     <interceptor-ref name="defaultStack" /> 
     <interceptor-ref name="notcontainskey" /> 
     <result type="redirect">/usercp.jsp</result> 
     <result name="input">/usercp-change-password.jsp</result> 
     <result name="index" type="redirect">/index.jsp</result> 
    </action> 

    <action name="logout" class="com.mypackage.action.LogoutAction"> 
     <result type="redirectAction"> 
      <param name="actionName">index</param> 
     </result> 
    </action> 
</package> 

NotContainsKeyInterceptor:

public class NotContainsKeyInterceptor extends AbstractInterceptor { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public String intercept(ActionInvocation actionInvocation) throws Exception { 
     System.out.println("NotContainsKeyInterceptor"); 

     final ActionContext actionContext = actionInvocation.getInvocationContext(); 
     Map<String, Object> session = actionContext.getSession(); 

     if(!session.containsKey("currentId")) { 
      return "index"; 
     } 

     String result = actionInvocation.invoke(); 

     return result; 
    } 
} 

http://localhost:8080/mysite/changepassword

  1. Когда я называю changepassword действия без вход в систему (т. session не содержит currentId), то println() из NotContainsKeyInterceptor не выполняется (что заставляет меня предположить это не называется), тем не менее, это не ожидаемое поведение Перенаправление на index.jsp.
  2. validate() способ ChangePasswordAction класс также вызываемый.

Почему это так?

(Пожалуйста, скажите мне, если вам нужно, чтобы увидеть ChangePasswordAction класс, я добавлю его к столбу.)

+1

На самом деле его не называется .. Можете ли вы изменить конфигурацию таким образом, и попробовать '<перехватчик-исх имя =«notcontainskey»/><имя перехватчик-исх =» defaultStack "/> 'Я имею в виду указать ваш перехватчик сначала позже' defaultstack' – Babel

+0

Interchanging работал. Если бы вы могли выразить это как официальный ответ, я воспользуюсь им. Благодарю. :) – silver

+1

Перехватчик вызывается в порядке, указанном элементами конфигурации. –

ответ

0

На самом деле его не называется .. Можете ли вы изменить конфигурацию таким образом, и попробовать

<interceptor-ref name="notcontainskey" /> 
    <interceptor-ref name="defaultStack" /> 

Я имею в виду указать свой перехватчик первый позже defaultstack

Смежные вопросы