响应的HandlerInterceptorAdapter,JSON编码和后处理(HandlerInt

2019-08-16 18:56发布

以前的设计

我有一个春天控制器建立像如下:

@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET)
public ModelAndView getFunfData(@PathVariable("datatype") String dataType,
        WebRequest request) throws HttpException {

我也有一个HandlerInterceptorAdapter是进行前处理和后处理(根据政策修改返回的模型)。 对于后处理处理程序中的签名是以下

@Override
public void postHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {

它实际上运作良好。 的REST API返回一个未结构良好的JSON有效载荷,但至少拦截器(策略执行点)能够从模型匿名化(条用户个人数据)和取代它。

问题的关键是与旧的设计,我能够检索响应之前,它被发送到输出,修改和重新注入它到ModelAndView实例。 无需上传代码简洁。

新的设计

现在,我发现了一个新的设计,帮助我克服了响应结构的缺陷。

当我return new ModelAndView(jacksonView_instance, "data", dataToConvertToJson)它的结构像

{
    "data": {
        "myAttr1":"myVal1"
     }
}

当接收程序要有效载荷转换成JSON这是坏的。 所以,我发现

@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET, produces = { "application/json" })
    public @ResponseBody
    Object[] getFunfData(@PathVariable("datatype") String dataType,
            WebRequest request) throws HttpException {

这简化了代码一点,最重要的作出反应良好的结构 ,像

{
    "myAttr1":"myVal1"
}

这是REST设计合同完全确定,但

问题

现在的HandlerInterceptor将无法再找回我从API返回的模式,因此对象(这是一个FUNF -相关API来处理个人数据,即使是敏感,记录在移动设备上)。

所以,如果我需要匿名化的记录,我不能做到这一点在像以前一样拦截

解决方法

我意识到,我可以杀了拦截和API在执行政策执行权,但这不是一个伟大的设计,甚至因为它进行授权的PEP preHandle和义务的执法中postHandle目前是自动的实例化一个Spring对象。 API中的拷贝和粘贴代码与多个API打交道时,一个坏主意,并在中短期改变/延长PEP执行的可能性。

无论如何,让我们制定一个直的问题后,已经解释了上下文以及

问题是

由于返回一个对象的通用Spring MVC的API来通过内容谈判来处理

@RequestMapping(value = "/path/{variable}", method = RequestMethod.GET)
public @ResponseBody Object api() {

如何可以拦截返回的对象在外部类进行修改,以使其? (例如,用一个新的对象实例来替换返回给客户端)

Answer 1:

看起来这是不可能的Spring MVC中。 我刚才看到在调试会话中的代码。

当您使用ModelAndView在生活,直到一个变量,Spring MVC的存储MAV postHandle ,然后写在响应体。

相反,当你使用@ResponseBody和返回值值直接调用循环处理,使用MessageConverter要写入的响应。

由于反应是单向网络数据流,它的拦截为时已晚。

该解决方案应当基于除了处理程序不同的方法,如直接施用到控制器方法AOP 拦截器



文章来源: HandlerInterceptorAdapter, JSON encoding and post processing of response