In spring mvc 3, how to write a cookie while returning a ModelAndView?

前端 未结 4 601
心在旅途
心在旅途 2020-12-24 07:59

My controller method is returning a ModelAndView, but there is also a requirement to write a cookie back to client. Is it possible to do it in Spring? Thanks. <

相关标签:
4条回答
  • 2020-12-24 08:14

    If you add the response as parameter to your handler method (see flexible signatures of @RequestMapping annotated methods – same section for 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x), you may add the cookie to the response directly:

    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 讨论(0)
  • 2020-12-24 08:20

    You can write a HandlerInterceptor that will take all Cookie instances from your model and generate the appropriate cookie headers. This way you can keep your controllers clean and free from 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 . Don't forget to register the interceptor either with <mvc:interceptors> (XML config) or WebMvcConfigurer.addInterceptors() (Java config).

    0 讨论(0)
  • 2020-12-24 08:26

    RustyX's solution 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);
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-24 08:34

    Not as part of the ModelAndView, no, but you can add the cookie directly to the HttpServletResponse object that's passed in to your controller method.

    0 讨论(0)
提交回复
热议问题