2011-02-03 56 views

回答

46

如果添加的響應作爲參數傳遞給你的處理方法(見flexible signatures of @RequestMapping annotated methods - 同一節3.2.x4.0.x4.1.x4.3.x5.0.x),您可以add the cookie直接回應:

科特林

@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

有時你需要調用`cookie.setPath( 「XXX」);`如果你想分享請求之間的餅乾。 – 2016-12-07 06:55:20

10

不作爲ModelAndView的一部分,否,但您可以將add the cookie directly轉換爲傳遞到您的控制器方法的HttpServletResponse對象。

5

您可以編寫一個HandlerInterceptor,它將從您的模型中獲取所有Cookie實例並生成相應的Cookie標頭。通過這種方式,您可以保持控制器清潔並免受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。不要忘記用<mvc:interceptors>(XML配置)或WebMvcConfigurer.addInterceptors()(Java配置)註冊攔截器。

+0

如果要配置是否將數據作爲Cookie,Header,JSON等進行配置並提供良好的問題分離,這特別有用。 – kuporific 2014-07-25 17:29:22

0

RustyX在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); 
      } 
     } 
    } 
相關問題