Cannot forward after response has been committed 问题

Posted longtengdama

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 问题的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException: Cannot forward after response has been committed

Cannot forward after response has been committed 问题

std::forward_list::insert_after 线程安全

使用 Detox 运行模拟器时出现问题:[DetoxServer.js/CANNOT_FORWARD] role=testee not connected

SSH port forwarding: bind: Cannot assign requested

lsnrctl: .... cannot restore segment prot after reloc: Permission denied