Spring mvc 如何在HandlerInterceptor.postHandle()方法中获取重定向属性

Spring mvc 如何在HandlerInterceptor.postHandle()方法中获取重定向属性,spring-mvc,interceptor,Spring Mvc,Interceptor,背景: web项目使用SpringMvc框架,需要前后对齐 分离重建。前端将使用React,一些用于返回jsp视图的后端控制器需要返回jsonObject。通过ModelMap传递到jsp的数据现在需要传输到json并通过Response写回。为了避免修改每个控制器,我想出了一个主意,使用拦截器来完成这项工作。它适用于那些控制器使用模型映射传递数据,但不适用于那些使用重定向属性传递数据 问题: 一些控制器返回重定向,并使用重定向属性传递属性。由于postHandler()只有4个参数:reque

背景:
web项目使用
SpringMvc
框架,需要前后对齐 分离重建。前端将使用
React
,一些用于返回
jsp
视图的后端
控制器需要返回
jsonObject
。通过
ModelMap
传递到
jsp
的数据现在需要传输到
json
并通过
Response
写回。为了避免修改每个
控制器
,我想出了一个主意,使用
拦截器
来完成这项工作。它适用于那些
控制器
使用
模型映射传递数据
,但不适用于那些使用
重定向属性
传递数据

  • 问题:
    一些控制器返回
    重定向
    ,并使用
    重定向属性
    传递属性。由于
    postHandler()
    只有4个参数:
    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();
        }
    }
    
    @覆盖
    public void postHandle(HttpServletRequest请求、HttpServletResponse响应、对象处理程序、ModelAndView ModelAndView)引发异常{
    if(modelAndView!=null){
    Map Map=modelAndView.getModel();
    字符串json=json.toJSONString(映射,SerializerFeature.DisableCircularReferenceDetect);
    debug(json);
    if(null!=json){
    试一试{
    setHeader(“内容类型”,“应用程序/json;字符集=UTF-8”);
    响应。setCharacterEncoding(“UTF-8”);
    PrintWriter pw=response.getWriter();
    write(json);
    pw.flush();
    关闭();
    }捕获(IOE异常){
    }
    }
    modelAndView.clear();
    }
    }
    
    问题1:我可以在拦截器中获取
    重定向属性吗?

    问题2:如果可以的话,如何解决?

    我尝试使用
    AOP
    ,完美地解决了问题。我发现
    AOP
    拦截器
    更强大。我可以更灵活地定义
    切点
    并使用
    getArgs()
    方法
    ProceedingJoinPoint
    获取所有参数,我尝试使用
    AOP
    ,完美地解决了问题。我发现
    AOP
    拦截器
    更强大。我可以更灵活地定义切点,并使用
    ProceedingJoinPoint
    getArgs()
    方法获取所有参数