2010-07-15 8 views
21

Qual è la differenza, in realtà, tra filtri e intercettori? Mi rendo conto che gli intercettori si attivano prima e dopo un'azione, in modo ricorsivo, e i filtri possono essere configurati per sparare su azioni e su determinati pattern di URL. Ma come fai a sapere quando usarli?Filtri contro intercettori in Struts 2

Nel libro che sto leggendo su Struts 2, sembra che gli intercettori vengano spinti e ho persino seguito un tutorial per scrivere un Interceptor di autenticazione per assicurarmi che un utente abbia effettuato l'accesso. Tuttavia, se l'utente prova ad accedere un URL che non ha un'azione associata ad esso, l'intercettore non lo cattura, il che significa che dovrei associare un'azione con ogni jsp che voglio essere sicuro. Non sembra giusto.

Posso creare un filtro di autenticazione che gestisca gli URL in modo da non doverlo fare, ma poi, qual è il punto di intercettazione?

+10

È buona norma incollare i file .jsp nella cartella/WEB-INF. In questo modo non possono essere richiesti direttamente dall'URL. Piuttosto, l'utente deve passare attraverso Azioni, che poi inoltrano al jsp corretto (a seconda del risultato). – Pat

risposta

4

lo stack di intercettatore si accende a ogni richiesta. I filtri
si applicano solo agli URL per i quali sono definiti.

modifica - si utilizzano uno o l'altro a seconda delle necessità. Diciamo che è necessario verificare che un cookie sia presente per ogni richiesta. Utente un intercettore. Diciamo che è necessario far apparire un'applicazione esterna su alcune richieste (guidata da un URL), utilizzare un filtro.

penso intercettori sono lo strumento più comunemente usato ...

perché si avere un URL senza azione associata?

+0

Lo stack interceptor si attiva solo per le richieste definite nel pacchetto per il quale lo stack è lo stack predefinito, ovvero posso avere azioni definite in altri pacchetti che l'intercettatore non attiva per un filtro simile, può essere selettivo . Un filtro può anche essere applicato a tutti gli URL. Per verificare se un cookie è presente, non vedo perché non si utilizzerebbe un filtro anche per quello. Se si dispone di un semplice jsp, ad esempio un modulo di caricamento dell'immagine, potrebbe non esserci alcun lavoro per il quale ho bisogno di un'azione. Dovrei fare classi d'azione per ogni jsp? Anche se sono vuoti? – JPC

+0

no hai ragione, se non c'è un punto per un'azione, allora non inserirne uno. Anche se da quello che ricordo un'azione può essere indirizzata a un jsp, si deve semplicemente restituire un valore di stringa. Penso che troverete che ci sono molti modi per fare le cose, quindi il fatto che ci sia una sovrapposizione è naturale. – hvgotcodes

+0

Suppongo che sto solo cercando le migliori pratiche e non sono stato in grado di trovare alcuna risposta. Ora, specialmente con il plugin per le convenzioni, se ho un modulo di caricamento, posso accedervi come un'azione digitando "/ upload-form" Non devo nemmeno accedere direttamente al jsp. Il problema è che questo non innesca un intercettore, quindi un filtro è l'unica cosa che lo catturerà. – JPC

42

La differenza più significativa è che gli "intercettori" fanno parte del framework Struts 2 e sono solo parte della gestione delle richieste eseguita dal framework Struts 2. I "filtri" d'altra parte fanno parte della specifica del servlet; in altre parole, fanno parte dell'API Servlet. Se si utilizza Struts 2, è necessario utilizzare gli interceptor per avvolgere la funzionalità attorno alle azioni di Struts 2. Se stai provando a racchiudere la funzionalità tra le richieste che arrivano alla tua webapp, ma che non sono gestite da Struts 2, allora un filtro potrebbe essere più appropriato.

BTW, l'intero framework Struts 2 viene distribuito all'interno di un filtro configurato nel vostro web app, dichiarata nel descrittore di deployment del tuo webapp (web.xml) come:

<filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Questo filtro, che è configurato per la cattura tutte le richieste di pattern URL, è il punto di ingresso nell'intero framework Struts 2.

Spero che questo aiuti.

+0

grazie per il suggerimento sulla differenziazione della struttura Servlet Spec e Struts 2. – asgs

+0

significa che hanno la stessa funzionalità. – hiway

+2

@hiway Non direi che hanno la stessa funzionalità, direi che svolgono lo stesso ruolo funzionale in due contesti molto diversi. – chad

4

Cos'è Interceptor?

Il framework Struts 2 utilizza il concetto di intercettori per condividere la soluzione di alcune preoccupazioni comuni con azioni diverse.

Come sappiamo, il framework richiama un particolare oggetto Action nella sottomissione di una richiesta per esso. Ma prima dell'esecuzione di Action, l'invocazione viene intercettata da qualche altro oggetto per fornire un'ulteriore elaborazione richiesta.

Analogamente dopo l'esecuzione di Azione, l'invocazione può essere nuovamente intercettata. Questo oggetto intercettatore è noto come Interceptor.

Quindi lo scopo di utilizzare Interceptor è quello di consentire un maggiore controllo sul livello controller e separare alcune logiche comuni che si applicano a più azioni.

Il framework Struts 2 ha già fornito il proprio set di Interceptor che può essere utilizzato nell'applicazione per fornire l'elaborazione richiesta prima e dopo l'esecuzione delle classi Action.

Uno di questi è "Alias ​​Interceptor" di cui parlerò qui.

Alias ​​Interceptor:

Alias ​​Interceptor viene utilizzato in caso di azione concatenamento. Il concatenamento delle azioni significa che una Azione chiama un'altra Azione dopo aver eseguito con successo la prima azione.

Questo intercettatore esegue l'alias di un parametro denominato su un nome di parametro diverso. Nel concatenamento di azioni, quando due diverse classi di azione condividono un parametro comune con un nome diverso, questo Interceptor viene utilizzato per fornire un nome alias a un parmeter della prima classe di azioni, che corrisponde al nome del parametro nella seconda classe di azioni.

L'alias espressione di azione dovrebbe essere sotto forma di:

   #{ 'name1' : 'alias1' , 'name2' : 'alias2' } 
3

Come per il ciclo di vita montanti 2/architettura non intercettori vengono eseguite prima del filtro. Quindi, se non c'è alcuna mappatura delle azioni per la tua richiesta, allora fallisce mentre passa attraverso il filtro.

0

Struts 2 Framework non dipende dall'API Servlet. Struts 2 Le azioni non sono accoppiate a un contenitore. Molto spesso i contesti servlet sono rappresentati come semplici mappe, consentendo di testare le azioni isolatamente.

Il filtro è una parte dell'API Servlet, pertanto Struts 2 Framework utilizza il concetto di intercettatori per condividere la soluzione per alcuni problemi comuni con azioni diverse.

Inoltre è possibile scrivere facilmente casi di test per Interceptor e classe Action.

0

Come regola empirica

  • filtri vengono eseguite prima di ogni request. Lo stesso struts è un filtro.
  • interceptors può essere eseguito prima, dopo le azioni di puntellamento. Non verranno eseguiti se la richiesta non termina con .action.

Così, alcuni esempi di filtri potrebbe essere:

  • Se si desidera comprimere i file js e css, si dovrebbe andare per non filtri intercettori.
  • Se si desidera che solo un determinato indirizzo IP acceda al proprio sito Web, è necessario svilupparlo come filtro e controllare l'indirizzo IP della richiesta.
  • Se si desidera proteggere il sito contro l'attacco CSRF, è necessario scrivere un filtro per verificare il token CSRF sulle richieste.
  • Se si desidera accedere la risposta sito per ogni richiesta di tempo, è possibile utilizzare un filtro per calcolare il tempo prima e dopo chain.doFilter(request, response)

Teoricamente è possibile sviluppare un'applicazione montanti web senza sviluppare la propria interceptors e utilizzando filters solo. Ma affronterai un sacco di problemi e filtri della caldaia del codice.

Un sacco di puntoni 2 caratteristiche sono costruite con intercettori, è possibile trovarlo in struts-default.xml (https://struts.apache.org/docs/struts-defaultxml.html) l'elenco aiuterà a trovare quando gli intercettori possono essere utilizzati. (Per esempio ParametersInterceptor corre prima di azioni di applicare i valori di forma iscritti da azioni)

Mentre si lavora con intercettori è possibile accedere facilmente puntoni caratteristiche, ad esempio getText dalle risorse del messaggio, ottenere il nome azione corrente e lo spazio nome, modificare l'azione flusso.

Considerando sopra qui sono alcuni casi che possono essere sviluppate da intercettori:

  • Se si desidera che solo gli utenti registrati possono accedere determinate azioni, è necessario sviluppare con intercettori.
  • Se si desidera tenere traccia delle azioni dell'utente è la navigazione. È possibile utilizzare un intercettore per tenere traccia delle azioni visitate.
  • Se si desidera gestire gli errori di azione in un unico punto, è possibile utilizzare un intercettore che catturano tutti invocation.invoke()

Gli intercettori stanno fornendo il filtro e la catena di design pattern responsabilità per le azioni Struts, mentre i filtri fornire questo modello alla tua intera applicazione web.