2011-02-03 5 views

답변

46

(flexible signatures of @RequestMapping annotated methods 참조 - 3.2.x에 대한 동일한 섹션, 4.0.x, 4.1.x, 4.3.x, 5.0.x)을, 당신은 할 수 있습니다 add the cookie을 직접 응답 :

코 틀린

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

자바

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

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

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

은 때로는'cookie.setPath ("XXX")를 호출 할 필요가, 당신이 요청 사이의 쿠키를 공유 할 경우'. –

10

ModelAndView의 일부로 아니지만, 컨트롤러 메소드로 전달 된 HttpServletResponse 개체에 add the cookie directly 수 있습니다. 당신이 당신의 처리기 메서드에 매개 변수로 응답을 추가하는 경우

5

모델에서 모든 쿠키 인스턴스를 가져 와서 적절한 쿠키 헤더를 생성하는 HandlerInterceptor을 작성할 수 있습니다. 이렇게하면 컨트롤러를 청결하게 유지하고 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 구성)으로 등록하는 것을 잊지 마십시오. 자바 8

+0

이것은 쿠키, 헤더, JSON 등으로 데이터를 반환할지 여부를 구성하고 문제를 효과적으로 구분할 때 특히 유용합니다. – kuporific

+0

이것은 정말 좋은 샘플 코드입니다. – mahesh

0

RustyX의 솔루션 :

@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); 
      } 
     } 
    } 
관련 문제