簡體   English   中英

如何在Spring中在HandlerInterceptor中為REST服務填充ModelAndView

[英]How to populate ModelAndView in HandlerInterceptor for REST service in Spring

我正在使用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 ,我只能處理請求和響應。

所以我有兩個問題:

  1. 有沒有一種方法,使春填充的ModelAndView,與數據,不與HttpServletResponse的 ,HttpEntityModelAndView中明確的工作離開控制器完好 (我不會使用ModelAndView添加Cookie,我只需要知道Intercepter中的Response Object,並將Cookie添加到HttpServletResponse。)
  2. 我當時正在考慮使用ThreadLocal解決此問題,但據我了解,這在異步處理的情況下會剎車。 是否有經過驗證的ThreadLocal解決方案,在我決定切換到異步處理的情況下不會中斷?

示例用例:

假設我正在進行A / B測試,並且基於Response中的Cookie,我的UI呈現的方式有所不同。 我希望有一個地方,可以根據返回對象指定此Cookie。

@ResponseBody的特殊之處在於,它告訴Spring響應已被處理(或者應該使用返回值進行處理)。 在這種情況下,由於不需要渲染視圖,因此不需要ModelAndView 因此,MVC堆棧不會創建ModelAndView並且將不會對HandlerInterceptor可用。 基本上,在調用postHandle ,響應已被刷新,您將無法編寫任何cookie。 而且,無論如何, ModelAndView都不是添加Cookie的適當位置。 HttpServletResponse是。

當您使用@ResponseBody ,Spring不會使用模型,您甚至都沒有在控制器方法中聲明過它,無論如何它都沒有意義。

但是,您始終可以使用請求屬性將數據從控制器傳遞到攔截器,並且它將能夠在其postHandle方法中使用它來決定如何處理響應和cookie。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM