如何在HandlerInterceptor.postHandle()方法中获取RedirectAttributes

时间:2017-08-18 05:58:56

标签: spring-mvc interceptor

  • 背景:
    一个Web项目使用SpringMvc框架需要前后 分离重建。前端将使用React,并且用于返回Controllers视图的后端jsp的某些内容需要返回jsonObject。传递到jspModelMap的数据现在需要转移到json并通过Response回写。为了避免修改每个Controller,我想出了使用Interceptor来完成这项工作的想法。它适用于那些使用Controllers的{​​{1}}传递数据,但它不适用于ModelMap传递数据。

  • 问题:
    某些控制器返回RedirectAttributes并使用redirect来传递属性。由于RedirectAttributes只有4个参数:postHandler()request,response,handler,因此我很难从modelAndView获取RedirectAttributes的属性。

控制器代码:

@RequestMapping(value="save")
public String save(CarInfoEntity entity, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes, Model model){
    redirectAttributes.addFlashAttribute("message", "success!");
    return "redirect:/demo/carInfo/list";
}

拦截代码:

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    if(modelAndView != null) {
        Map<String, Object> map = modelAndView.getModel();
        String json = JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect);
        logger.debug(json);
        if (null != json) {
            try {
                response.setHeader("Content-type", "application/json;charset=UTF-8");
                response.setCharacterEncoding("UTF-8");
                PrintWriter pw = response.getWriter();
                pw.write(json);
                pw.flush();
                pw.close();
            } catch (IOException e) {
            }
        }
        modelAndView.clear();
    }
}

问题1:我可以在拦截器中获得RedirectAttributes吗? 问题2:如果可以,怎么办?

1 个答案:

答案 0 :(得分:0)

我尝试使用AOP,完美解决了问题。我发现Interceptercut points更强大。我可以更灵活地定义getArgs(),并使用ProceedingJoinPoint的{​​{1}}方法获取所有参数。