首页 > 代码库 > Cannot forward after response has been committed 问题

Cannot forward after response has been committed 问题

1、问题的出现:当用户进入主页的时候,我需要判断是来着移动端还是pc端,于是我用了拦截器,拦截所有请求;

2、操作:1)mvc配置文件<mvc:interceptor>
                                  <mvc:mapping path="/**" />
                                            <bean class="com.thinkgem.jeesite.modules.sys.interceptor.MobileInterceptor" />
                                 </mvc:interceptor>
                         </mvc:interceptors>

              2)拦截器中的三个方法:红色注释部分是错误代码,错误原因

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) throws Exception {
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        if (modelAndView != null){
            // 如果是手机或平板访问的话,则跳转到手机视图页面。

           /*if(IsFromPcOrPhone.JudgeIsMoblie(request)){//手机端
                request.getRequestDispatcher("/h5qingnianbang/index.jsp").forward(request, response);
            }else{//pc
                request.getRequestDispatcher("/qingnianbang/index.jsp").forward(request, response);
            }*/
            if(UserAgentUtils.isMobileOrTablet(request) && !StringUtils.startsWithIgnoreCase(modelAndView.getViewName(), "redirect:")){
                modelAndView.setViewName("h5qingnianbang/index" );
            }else{
                modelAndView.setViewName("qingnianbang/index" );
            }
        }
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
            Object handler, Exception ex) throws Exception {
    }

  3、问题原因:

           

preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。

afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

  4、原因分析:红色错误的代码逻辑是访问jsp页面,这样会被再一次拦截,进入拦截器,又再次的重定向,再被拦截,如此循环,但是没有一种循环下去,不知道为何,所有导致错误的出现。

Cannot forward after response has been committed 问题