博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务端有异常, 导致: Ajax 请求报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING
阅读量:6977 次
发布时间:2019-06-27

本文共 3735 字,大约阅读时间需要 12 分钟。

服务端有异常, 导致: Ajax 请求报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING

但是,这个 Ajax Http 接口使用浏览器可以直接返回。表明,Ajax 的 Get 跟浏览器的 Http Get 在实现上有差异。浏览器做了更好的容错处理。

解决方法:

去掉override fun postHandle 函数上的 @Throws(Exception::class) 。

因为,这个postHandle里面会报一个异常,导致 Ajax 请求响应过程的 Error。

java.lang.IllegalStateException: getOutputStream() has already been called for this response

package com.easy.springboot.demo_spring_mvc.handlerimport com.easy.springboot.demo_spring_mvc.constant.CommonContextimport com.easy.springboot.demo_spring_mvc.entity.Userimport com.fasterxml.jackson.databind.ObjectMapperimport org.slf4j.LoggerFactoryimport org.springframework.stereotype.Componentimport org.springframework.util.StringUtilsimport org.springframework.web.servlet.HandlerInterceptorimport org.springframework.web.servlet.ModelAndViewimport java.io.ByteArrayOutputStreamimport java.io.PrintWriterimport javax.servlet.http.HttpServletRequestimport javax.servlet.http.HttpServletResponse/** * HandlerInterceptor拦截器的最终调用实现是在DispatcherServlet的doDispatch方法中, * 并且SpringMVC提供了HandlerExecutionChain来帮助我们执行所有配置的HandlerInterceptor拦截器, * 并分别调用HandlerInterceptor所提供的方法。 */@Componentclass LoginSessionHandlerInterceptor : HandlerInterceptor {    var log = LoggerFactory.getLogger(LoginSessionHandlerInterceptor::class.java)    /**     * 进入controller层之前拦截请求     *     * preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行     *     * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在     * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在     * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返     * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。     *     * @param httpServletRequest     * @param httpServletResponse     * @param o     * @return     * @throws Exception     */    @Throws(Exception::class)    override fun preHandle(httpServletRequest: HttpServletRequest, httpServletResponse: HttpServletResponse, o: Any): Boolean {        log.info("---------------------开始进入 LoginSessionHandlerInterceptor 拦截----------------------------")        val session = httpServletRequest.session        val currentUser = session.getAttribute(CommonContext.CURRENT_USER_CONTEXT) as? User        log.info("currentUser ===> ${ObjectMapper().writeValueAsString(currentUser)}")        if (!StringUtils.isEmpty(currentUser)) {            return true        } else {            val printWriter = httpServletResponse.writer            printWriter.write("{code:0,message:\"session is invalid,please login again!\"}")            return false        }    }    /**     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作     * 可在 modelAndView 中加入数据,比如当前时间;     *     * mappedHandler.applyPostHandle(processedRequest, response, mv):最终会调用HandlerInterceptor的postHandle方法     * 具体实现是在HandlerExecutionChain中实现如下,就是获取所有的拦截器并调用其postHandle方法。     */    override fun postHandle(httpServletRequest: HttpServletRequest, httpServletResponse: HttpServletResponse, o: Any, modelAndView: ModelAndView?) {        log.info("--------------  postHandle: 在执行 Controller的处理后,在处理 ModelAndView 前执行 ---------------")        log.info("httpServletRequest => {}", httpServletRequest)        log.info("httpServletResponse => {}", httpServletResponse)        log.info("o => {}", o)        log.info("modelAndView => {}", modelAndView)    }    /**     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等     *     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的 afterCompletion()     */    override fun afterCompletion(httpServletRequest: HttpServletRequest, httpServletResponse: HttpServletResponse, o: Any, e: Exception?) {        log.info("--------------- afterCompletion : 在 DispatchServlet 执行处理完 ModelAndView 后执行 -------------------------")    }}

转载地址:http://ccypl.baihongyu.com/

你可能感兴趣的文章
make报错:"/usr/bin/ld: cannot find -lXXX"
查看>>
GRUB2相关概念
查看>>
centos 6.4 SVN服务器多个项目的权限分组管理
查看>>
Anaconda中安装Orange3脚本-完整版
查看>>
Windows平台上实现P2P服务(三)
查看>>
nginx转发及后端服务器获取真实client的IP
查看>>
维护学习的一点体会与看法
查看>>
corosync+pacemaker+crm简单配置
查看>>
Linux学习笔记之文件管理和目录管理类命令
查看>>
综合技术 --@Autowired和@Resource
查看>>
SoapUI进行REST请求,POST方法提交到数据库的数据乱码问题
查看>>
MFC界面库BCGControlBar v25.3新版亮点:Gauge Controls
查看>>
DevExpress v17.2新版亮点—WPF篇(四)
查看>>
Java Script 第四节课 Java Script的隐式转换
查看>>
第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC
查看>>
easy installation booster system——stream
查看>>
今天开始记录自己苹果开发博客旅程!~
查看>>
如果根据日志去禁用user_agent
查看>>
安装flash
查看>>
nginx
查看>>