Spring mvc拦截器addObject

时间:2012-03-20 11:37:26

标签: spring-mvc interceptor

我有一个延伸HandlerInterceptorAdapter的拦截器。

当我向ModelAndView添加一个对象时,它也会作为路径变量添加到我的url中,但我不希望这样。

@Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    if (null == modelAndView) {
      return;
    }

    log.info("Language in postHandle: {}", LocaleContextHolder.getLocale());
    modelAndView.addObject("selectedLocale", LocaleContextHolder.getLocale());
}

当我在控制器本身的ModelAndView中添加内容时,它不会显示在网址中。

4 个答案:

答案 0 :(得分:11)

我怀疑控制器已返回重定向视图。当您向RedirectView使用的模型添加属性时,Spring会将属性添加到URL。

尝试查看ModelAndView对象内部以查看该视图是否为RedirectView,如果是,则不要添加语言环境属性。

答案 1 :(得分:7)

试试这个

import static org.springframework.web.servlet.view.UrlBasedViewResolver.REDIRECT_URL_PREFIX; 

private boolean isRedirectView(ModelAndView mv) {

    String viewName = mv.getViewName();
    if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
        return true;
    }

    View view = mv.getView();
    return (view != null && view instanceof SmartView
            && ((SmartView) view).isRedirectView());
}

答案 2 :(得分:1)

我编辑了代码并添加了一个检查是否是RedirectView。如果不是,我将添加其他模型对象。

@Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    if (null == modelAndView) {
      return;
    }

    log.info("Language in postHandle: {}", LocaleContextHolder.getLocale());

    if(!(modelAndView.getView() instanceof RedirectView)) {
      addAdditionalModelObjects(request, modelAndView);
    }
  }

答案 3 :(得分:0)

我在请求中使用了setAttribute而不是解决这个问题

request.setAttribute("jsFiles", children);