我正在使用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/

10-11 05:04