我正在使用Spring框架构建RESTfull服务。
我需要根据响应类型在Controller中处理请求后,将自定义Cookie添加到响应中
@Controller
public class SomeController {
...
@RequestMapping(method = RequestMethod.GET, value = MY_PROFILE, produces = PRODUCES)
public @ResponseBody Some myProfile(@RequestBody() A a) {
...
}
...
}
但是到了我的拦截器
public class SomeIntercepter implements HandlerInterceptor {
...
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
...
}
ModelAndView为NULL,我只能处理请求和响应。
所以我有两个问题:
有没有办法让Spring用数据填充ModelAndView,而无需显式使用HttpServletResponse,HttpEntity或ModelAndView,而使Controller保持完整? (我不会使用ModelAndView添加Cookie,我只需要了解Intercepter中的Response Object,并将Cookie添加到HttpServletResponse。)
我当时正在考虑使用ThreadLocal解决此问题,但据我了解,在异步处理的情况下,这样做会刹车。是否有经过验证的ThreadLocal解决方案,在我决定切换到异步处理的情况下不会中断?
示例用例:
假设我正在进行A / B测试,并且基于Response中的Cookie,我的UI呈现的方式有所不同。
我希望有一个地方,可以根据返回对象指定此Cookie。
最佳答案
@ResponseBody
的特殊之处在于,它告诉Spring响应已经被处理(或者应该使用返回值来处理)。在这种情况下,由于没有要渲染的视图,因此不需要ModelAndView
。因此,MVC堆栈不会创建ModelAndView
,并且HandlerInterceptor
都不可用。基本上,在调用postHandle
时,响应已经刷新,您将无法编写任何cookie。而且,无论如何,ModelAndView
都不是添加cookie的适当位置。 HttpServletResponse
是。
关于java - 如何在Spring中在HandlerInterceptor中为REST服务填充ModelAndView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25174257/