컨트롤러 메서드가 ModelAndView
을 반환하지만 클라이언트에 쿠키를 다시 써야한다는 요구 사항이 있습니다. 봄에 할 수 있습니까? 감사.봄 mvc 3, ModelAndView 반환하는 동안 쿠키를 작성하는 방법?
23
A
답변
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");
}
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
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);
}
}
}
은 때로는'cookie.setPath ("XXX")를 호출 할 필요가, 당신이 요청 사이의 쿠키를 공유 할 경우'. –