2011-02-03 9 views

risposta

46

Se si aggiunge la risposta come parametro per il vostro metodo del gestore (vedi flexible signatures of @RequestMapping annotated methods - stessa sezione per 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x), si può add the cookie alla risposta diretta:

Kotlin

@RequestMapping(["/example"]) 
fun exampleHandler(response: HttpServletResponse): ModelAndView { 
    response.addCookie(Cookie("COOKIENAME", "The cookie's value")) 
    return ModelAndView("viewname") 
} 

Java

@RequestMapping("/example") 
private ModelAndView exampleHandler(HttpServletResponse response) { 

     response.addCookie(new Cookie("COOKIENAME", "The cookie's value")); 

     return new ModelAndView("viewname"); 
} 
+0

A volte è necessario chiamare 'cookie.setPath ("xxx");' se si desidera condividere il cookie tra le richieste. –

10

non come parte del ModelAndView, no, ma è possibile add the cookie directly all'oggetto HttpServletResponse che è passato al tuo metodo di controllo.

5

Puoi scrivere un HandlerInterceptor che prenderà tutte le istanze di Cookie dal tuo modello e genererà le intestazioni dei cookie appropriate. In questo modo è possibile mantenere i controller puliti e liberi da HttpServletResponse.

@Component 
public class ModelCookieInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception { 
     if (modelAndView != null) { 
      for (Object value : modelAndView.getModel().values()) { 
       if (value instanceof Cookie) 
        res.addCookie((Cookie) value); 
      } 
     } 
    } 

} 

NB. Non dimenticare di registrare l'intercettore con <mvc:interceptors> (config XML) o WebMvcConfigurer.addInterceptors() (configurazione Java).

+0

Ciò è particolarmente utile se si desidera configurare se restituire i dati come Cookie, Intestazione, JSON, ecc. E fornisce una buona separazione dei problemi. – kuporific

+0

Questo è davvero un buon codice di esempio. – mahesh

0

soluzione RustyX in Java 8:

@Component 
    public class ModelCookieInterceptor extends HandlerInterceptorAdapter { 

     @Override 
     public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception{ 
      if (modelAndView != null) { 
       modelAndView.getModel().values().stream() 
        .filter(c -> c instanceof Cookie) 
        .map(c -> (Cookie) c) 
        .forEach(res::addCookie); 
      } 
     } 
    } 
Problemi correlati