2013-06-05 8 views
5

Użyłem frameworka Struts 2 i utworzyłem aplikację internetową, która ma stronę logowania. Mam trzy różne klasy Action o nazwach Action1, Action2, Action3 i różne widoki stron JSP, które są renderowane przez uruchomienie jakiejś logiki biznesowej w klasach Action.Struts2 dodając przechwytywacze w pliku struts.xml dla wszystkich klas działania

Teraz chcę sprawdzić, czy użytkownik zalogował się przed przetwarzaniem klasy Action. Więc stworzyłem przechwytujący poniżej, który działa dobrze.

public String intercept(ActionInvocation invocation) throws Exception 
{ 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    HttpServletResponse response = ServletActionContext.getResponse(); 
    HttpSession   session = request.getSession(); 

    if(session.isNew()) 
    { 
     response.sendRedirect("Login.action"); 
    } 

    System.out.println("Interceptor Fired"); 
    String result = invocation.invoke(); 
    return result; 
} 

Co chcę być w struts.xml jest zamiast dodawania przechwytywania dla wszystkich działań, takich jak ten poniżej

<interceptor-ref name="newStack"/> 

mój plik struts.xml ma

<package name="default" extends="struts-default">  
    <interceptors> 
    <interceptor name="printMsgInterceptor" class="LoginInterceptor"></interceptor> 
     <interceptor-stack name="newStack"> 
     <interceptor-ref name="printMsgInterceptor"/> 
     <interceptor-ref name="defaultStack" /> 
     </interceptor-stack> 
    </interceptors> 

    <action name="actone" class="Action1"> 
     <result name="success">/success.jsp</result> 
     <interceptor-ref name="newStack"/> 
    </action> 
     <action name="acttwo" class="Action2"> 
     <result name="success">/success.jsp</result> 
     <interceptor-ref name="newStack"/> 
    </action> 
     <action name="actthree" class="Action3"> 
     <result name="success">/success.jsp</result> 
     <interceptor-ref name="newStack"/> 
    </action> 
    </package> 

Dla każdej akcji I chcesz mieć jakąś definicję napisaną w struts.xml, która uruchamia przechwytywacz zamiast ręcznie dodawać

<interceptor-ref name="newStack"/> 

Odpowiedz

12
<interceptor name="test" class="Full path for LoginInterceptor" /> 

    <interceptor-stack name="testStack"> 
     <interceptor-ref name="test"/> 
     <interceptor-ref name="defaultStack"/> //here you are including default stack 
    </interceptor-stack> 

</interceptors> 
<default-interceptor-ref name="testStack"></default-interceptor-ref> 

Teraz testStack wykona dla każdego żądania

+0

Dzięki za odpowiedź działa gr8 Nie chcę tego przechwytywacza tylko dla jednej strony, która jest stroną logowania, ponieważ powoduje to przekierowanie pętli. Jest tam sposób na uniknięcie przechwytywacza dla jednej konkretnej Action –

+1

\t \t \t \t \t \t .... \t \t – PSR

+0

Alternatywnie można zdefiniować stos przechwytywania dla konkretnego pakietu i każdego pakietu, który rozciąga się użyje swojego domyślnego stosu.Inne akcje, które nie powinny być przechwytywane (takie jak Login) można zdefiniować w innych pakietach, które nie rozszerzają tego, w którym zdefiniowano domyślny stos przechwytywacza –

5

Zastosowanie

<default-interceptor-ref name="newStack"/> 

Jeśli nie oddanie interceptor-ref ręcznie dla każdego działania można użyć default-interceptor-ref przechwytywać wszystkie działania, które nie wprost zdefiniowana konfiguracja przechwytujących. Zobacz How do we configure an Interceptor to be used with every Action.

Możemy tworzyć własne nazwanych stosów, a nawet zadeklarować nową domyślną przechwytywania stos dla pakietu

<package name="default" extends="struts-default" > 
    <interceptors> 
     <interceptor-stack name="myStack"> 
      <interceptor-ref name="timer"/> 
      <interceptor-ref name="logger"/> 
     <interceptor-ref name="defaultStack"/> 
     </interceptor-stack> 
    </interceptors> 

Jeśli jednak powiedzieć, że przechwytujący powyżej działa dobrze będzie zachęcam do być ostrożnie podchodzi do logiki biznesowej, że akcja logowania nie zostanie wykonana, jeśli nie powiedzie się przy pierwszym uruchomieniu. Zamiast sprawdzania nowej sesji należy sprawdzić wyniki uwierzytelnionego użytkownika i zapisać wyniki w sesji, którą można sprawdzić w przechwytywaczu. Zobacz to pytanie dla example.

Przykład zapisu przechwytywacza korzystającego z uwierzytelnionych informacji o użytkowniku z sesją, który można znaleźć pod adresem here.

Powiązane problemy