2015-09-28 15 views
6

Ho bisogno di aggiungere l'intestazione in ogni risposta. Ho in programma di fare sottoAggiunta intestazione in risposta nel filtro?

public class MyFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
            HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     filterChain.doFilter(request, response); 
      response.addHeader("Access-Control-Allow-Origin", "*"); 
    } 

} 

vorrei farlo dopo filterChain.doFilter(request, response) modo che una volta processo di controllo, mi basta aggiungere un colpo di testa prima di tornare al cliente. È corretto ?

Ma Come per How to write response filter?

Dopo chain.doFilter è tornato, è troppo tardi per fare qualcosa con la risposta. A questo punto, l'intera risposta è stata già inviata al client e il tuo codice non ha accesso ad esso.

La dichiarazione di cui sopra non mi sembra corretta. Non posso aggiungere l'intestazione dopo filterChain.doFilter(request, response)? Se no perché?

sto usando molla mvc.

+0

Non si può usare un intercettore Spring MVC invece di un filtro? –

risposta

10

Dopo che filterChain.doFilter viene chiamato è troppo tardi per fare qualsiasi cosa con la risposta. A questo punto, l'intera risposta è stata già inviata al client.

È necessario creare una risposta a capo nelle proprie classi, passare questi wrapper nel metodo doFilter e gestire qualsiasi elaborazione nei wrapper.

Esiste già un wrapper di risposta: HttpServletResponseWrapper che è possibile estendere. Per esempio:

public class MyResponseRequestWrapper extends HttpServletResponseWrapper{ 
    public MyResponseRequestWrapper(HttpServletResponse response) { 
     super(response); 
    } 
} 

Il filtro:

@Override 
protected void doFilterInternal(HttpServletRequest request, 
           HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 

    HttpServletResponse myResponse = (HttpServletResponse) response; 
    MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse); 
    responseWrapper.addHeader("Access-Control-Allow-Origin", "*"); 
    filterChain.doFilter(request, myResponse); 
} 
+0

Perché utilizzare wrapper nell'esempio invece di aggiungere semplicemente l'intestazione all'implementazione originale passata per contenitore? Penso che il wrapper abbia senso solo se si implementa una logica all'interno per assicurarsi che l'intestazione non venga rimossa/sovrascritta da qualche parte lungo la catena del filtro. – troy

0

From perfect article

Un filtro che modifica la risposta di solito deve catturare la risposta prima di essere restituito al client. Per fare ciò, si passa un flusso di supporto al servlet che genera la risposta. Lo stream di supporto impedisce al servlet di chiudere il flusso di risposta originale quando viene completato e consente al filtro di modificare la risposta del servlet.

Per passare questo flusso di supporto al servlet, il filtro crea un wrapper di risposta che sovrascrive il metodo getWriter o getOutputStream per restituire questo flusso di supporto. Il wrapper viene passato al metodo doFilter della catena di filtri. I metodi wrapper vengono impostati in modo predefinito per richiamare la richiesta spostata o l'oggetto risposta. Questo approccio segue il noto pattern Wrapper o Decorator descritto in Design Patterns,

Problemi correlati