2013-06-05 13 views
5

Ho usato il framework Struts 2 e ho creato un'applicazione web che ha una pagina di login. Ho tre diverse classi Action denominate Action1, Action2, Action3 e diverse visualizzazioni per pagine JSP che vengono visualizzate eseguendo alcune regole di business nelle classi Action.puntoni2 aggiunta di interceptor in struts.xml per tutte le classi di azioni

Ora, voglio verificare se un utente ha effettuato l'accesso prima che la classe Action esegua l'elaborazione. Quindi, ho creato un intercettore qui sotto che funziona bene.

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; 
} 

Quello che voglio essere in struts.xml è invece di aggiungere un intercettore per tutte le azioni come quella qui sotto

<interceptor-ref name="newStack"/> 

Il mio file struts.xml ha

<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> 

Per ogni azione che desidera avere una definizione scritta in struts.xml che esegua l'intercettatore anziché aggiungere manualmente

<interceptor-ref name="newStack"/> 

risposta

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> 

Ora testStack eseguirà per ogni richiesta

+0

Grazie per la risposta Funziona gr8 Non voglio questo intercettore per una sola pagina che è la Pagina di accesso perché genera un ciclo di reindirizzamento. C'è un modo per evitare l'interceptor per una particolare azione –

+1

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

+0

in alternativa è possibile definire lo stack intercettore per un pacchetto specifico e ogni pacchetto che estende userà il suo stack predefinito.Altre azioni che non dovrebbero essere intercettate (come Login) possono essere definite in altri pacchetti che non estendono quello in cui hai definito lo stack predefinito dell'intercettore –

5

Usa

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

Se non mettere interceptor-ref manualmente per ogni azione è possibile utilizzare il default-interceptor-ref per intercettare tutte le azioni che non ha esplicitamente configurazione definita degli interceptor. Vedi How do we configure an Interceptor to be used with every Action.

Siamo in grado di creare le nostre pile di nome e anche dichiarare un nuovo stack di default intercettore per un pacchetto

<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> 

Tuttavia, se si dice che l'intercettatore sopra funziona bene vi incoraggio a essere cauto su una logica di business che l'azione di login non verrà eseguita se fallisce alla prima esecuzione. Invece di controllare la nuova sessione, è necessario verificare i risultati dell'utente autenticato e salvare questi risultati nella sessione che è possibile controllare nell'intercettore. Vedi questa domanda per example.

L'esempio di scrittura dell'intercettore che utilizza le informazioni utente autenticate con la sessione è possibile trovare here.

Problemi correlati