In primavera MVC 3, come scrivere un cookie mentre restituirà un modello
-
28-10-2019 - |
Domanda
Il mio metodo del controller sta restituendo un ModelAndView
, ma c'è anche l'obbligo di scrivere un cookie al cliente. È possibile farlo in primavera? Grazie.
Soluzione
Se aggiungi la risposta come parametro al metodo del tuo gestore (vedi firme flessibili di @RequestMapping
Metodi annotati - Stessa sezione per 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x), potresti Aggiungi il cookie alla risposta direttamente:
Kotlin
@RequestMapping(["/example"])
fun exampleHandler(response: HttpServletResponse): ModelAndView {
response.addCookie(Cookie("COOKIENAME", "The cookie's value"))
return ModelAndView("viewname")
}
Giava
@RequestMapping("/example")
private ModelAndView exampleHandler(HttpServletResponse response) {
response.addCookie(new Cookie("COOKIENAME", "The cookie's value"));
return new ModelAndView("viewname");
}
Altri suggerimenti
Non come parte del ModelAndView
, no, ma puoi Aggiungi direttamente il cookie al HttpServletResponse
Oggetto che è passato al metodo del controller.
Puoi scrivere un HandlerInterceptor
Ciò prenderà tutte le istanze dei cookie dal tuo modello e genererà le intestazioni di cookie appropriate. In questo modo puoi mantenere i tuoi 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 neanche l'interceptor con <mvc:interceptors>
(Config XML) o WebMvcConfigurer.addInterceptors()
(Config java).
La soluzione di 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);
}
}
}