Au printemps mvc 3, comment écrire un cookie en renvoyant un ModelAndView?
-
28-10-2019 - |
Question
Ma méthode de contrôleur renvoie un ModelAndView
, mais il est également nécessaire de réécrire un cookie au client.Est-il possible de le faire au printemps?Merci.
La solution
Si vous ajoutez la réponse en tant que paramètre à votre méthode de gestionnaire (voir signatures flexibles des méthodes annotées @RequestMapping
- même section pour 3.2.x , 4.0.x , 4.1.x , 4.3.x , < a href="http://docs.spring.io/spring/docs/5.0.x/spring-framework-reference/htmlsingle/#mvc-ann-arguments" rel="noreferrer"> 5.0.x ), vous pouvez
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");
}
Autres conseils
Pas dans le cadre du ModelAndView
, non, mais vous pouvez ajoutez le cookie directement à l'objet HttpServletResponse
qui est passé à votre méthode de contrôleur.
Vous pouvez écrire un HandlerInterceptor
qui prendra toutes les instances de Cookie de votre modèle et générera les en-têtes de cookie appropriés.De cette façon, vous pouvez garder vos contrôleurs propres et exempts de 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.N'oubliez pas d'enregistrer l'intercepteur soit avec <mvc:interceptors>
(configuration XML) ou WebMvcConfigurer.addInterceptors()
(configuration Java).
La solution RustyX en 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);
}
}
}