调查一个 pdf 打印报错:

ExceptionConverter: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error

at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:407)

at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)

at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)

at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:432)

at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:420)

at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)

at java.io.BufferedOutputStream.write(Unknown Source)

at com.itextpdf.text.pdf.OutputStreamCounter.write(OutputStreamCounter.java:157)

at java.io.ByteArrayOutputStream.writeTo(Unknown Source)

at com.itextpdf.text.pdf.PdfStream.toPdf(PdfStream.java:353)

at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:157)

at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:396)

at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:376)

at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:329)

at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:780)

at com.itextpdf.text.pdf.TrueTypeFontUnicode.writeFont(TrueTypeFontUnicode.java:385)

at com.itextpdf.text.pdf.FontDetails.writeFont(FontDetails.java:274)

at com.itextpdf.text.pdf.PdfWriter.addSharedObjectsToBody(PdfWriter.java:1249)

at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1169)

at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:780)

at com.itextpdf.text.Document.close(Document.java:409)

可以看到 在 调用 pdf 的 Document.close() 方法时,抛出了上诉错误。

调试之后的原因是,在chrome浏览器中页面上 点击一次 打印,打印 servlet 会执行两次,第一次 可以正常打印,document.close() 可以正常执行,没有报错,可以执行完了之后,servlet又一次执行了!所以在第二次 document.close() 时,报错:

ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error

原因是,浏览器已经关闭了连接,所以第二次 向浏览器输出 :

response.setContentType("application/pdf");

时,才报错。

发现只有 chrome才存在这个问题。调查的结果:

-----------------------------------------------------------------------------------------

http://blog.lifw.org/post/66162597

贴下全文:

chrome等浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常

博主在写一篇关于文件下载的博文 http://blog.lifw.org/post/24251622 时,遇到了一个很恶心的问题,现象是我在 chrome 以及 Safari 浏览器地址栏直接输入文件下载链接 localhost:8080/download 时,我的 download 方法被请求了两次,并且第一次抛出如下的 ClientAbortException 异常

然后 chrome 了很多资料,最后终于找到原因:由于 chrome、Safari 等浏览器为了使网页加载更快,使用了一种叫做预提取资源,以便更快速地加载网页机制,也就是说当你在浏览器中输入 url 后,即便你还没回车发送请求,浏览器也会预先发送请求加载资源,因此每当我在地址栏中输入 url localhost:8080/download 时,浏览器便发送请求到我的 download 方法中,然后我的 download 方法给浏览器返回一个文件下载响应,此时,浏览器一看是文件下载,不能预先加载,因此便主动关闭了链接,便导致了ClientAbortException 异常,然后我回车真正发送了该请求,浏览器便会下载文件,此时没有异常,文件下载成功。综上所诉,便导致 chrome 一个请求发送两次的现象。

网上查找资料的过程中,看到有的人在做计数统计的时候,如果使用 chrome,则每次请求会计数两次,其实也是该问题导致的,因此如果你在开发的过程中,如果莫名其妙的遇到一个请求发送多次的问题,不妨往这方面考虑一下,关闭 chrome 的预提取资源功能测试一下,往往便能解决问题。这个问题非常恶心,并且不易察觉,希望本文能对后来人有所帮助。

谷歌浏览器怎么重发请求_chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常...相关推荐

  1. 谷歌浏览器怎么重发请求_Chrome浏览器F12开发者工具的几个小技巧总结

    1.直接修改页面元素 选择页面上元素,右键"检查",会打开开发者工具窗口,显示当前选择元素的源代码,可以双击进行修改. 如果要修改的东西比较多,可以折叠元素并单击选择,再右键Edi ...

  2. chrome打开html文件显示不全,谷歌浏览器显示不全怎么办_chrome浏览器打开的网页显示不完整如何解决-win7之家...

    大家在使用谷歌chrome浏览器的时候,是否遇到这样的现象,就是在使用谷歌浏览器浏览网页的时候,发现网页显示不全,遇到这样的问题该怎么办呢,其实只要在区域设置里更改一下区域位置就可以了,现在给大家讲解 ...

  3. 谷歌浏览器打开普通用户_Chrome浏览器的用户账户和密码如何导入其他浏览器

    释放双眼,带上耳机,听听看~! 当我们要更换浏览器时,chrome浏览器内的用户帐号和密码如何能同步过去呢,如果新的浏览器是火狐或者是欧朋,这些浏览器都有同步导入的提示,根据提示操作就可以导入,很简单 ...

  4. chrome network抓包_谷歌浏览器抓包教程_chrome浏览器如何抓包-win7之家

    许多小伙伴在日常工作中可能都会需要进对抓取到网络的相关数据进行分区,用于查看访问到服务器中返回的数据是否正确,还可以通过这些数据来做一些相关测试,在谷歌chrome浏览器中,就有提供了开发者工具的选项 ...

  5. data 谷歌浏览器更改user 路径_chrome浏览器的跨域设置——包括版本49前后两种设置...

    做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...

  6. data 谷歌浏览器更改user 路径_Chrome浏览器自定义设置个人信息存储路径

    序言 Chrome浏览器很好用,感觉也很快,但是,也是有那么几个小瑕疵的.例如,Chrome浏览器无法设置安装路径,只能安装在默认的C盘,个人信息默认放在C盘,详细路径如下: 对于我这种对C盘有洁癖的 ...

  7. SOAPUI 利用Groovy脚本串连登录请求——将response的header和body传递给下一个请求

    SOAPUI 实现 一键化 SOAP 登录 测试soap接口需要先登录,但登录加密过程复杂,难道必须手动 发送多次请求并拷贝最终的cookie到待测请求的header?只要你敢想,就没什么做不到的.笔 ...

  8. Ajax请求成功却执行error回调方法(Ajax跨域请求问题)

    遇到的问题描述: Ajax使用post请求添加分组,请求url是RESTful风格.添加成功了已经向数据库写入了信息,但是Ajax却执行了error回调,观察网络发现有两次相同请求一次是get请求,一 ...

  9. 在谷歌浏览器中如何查看js代码在终端的运行结果、如何查看请求头信息

    在谷歌浏览器中如何查看js代码在终端的运行结果.如何查看请求头信息 1 如何查看js代码在终端的运行结果(如何打开终端) 2 查看请求头信息 1 如何查看js代码在终端的运行结果(如何打开终端) 方法 ...

最新文章

  1. Replace函数语法
  2. 计算机网络-子网划分举例
  3. python PyQt5 QColor()函数
  4. spring boot 整合mongoDb
  5. 小姐姐笔记:我是如何学习简单源码拓展视野的
  6. cuda编程_CUDA刷新器:CUDA编程模型
  7. 数据可视化系列(五):样式色彩秀芳华
  8. 搜索引擎优化(SEO,Search Engine Optimization)如何让你的网站靠前排名
  9. Linux Interrupt——魅族内核大神文章
  10. 如何使用python进行社交网络分析
  11. 滴滴上市,我的一位前同事身家过亿了!
  12. arc093F Dark Horse
  13. css 多行文字左对齐,纯CSS实现文字一行居中,多行左对齐的方法
  14. 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
  15. 字节跳动扣响搜索扳机
  16. vue.js 构建项目_使用Vue.js和AWS Amplify构建Chatbot
  17. “大数据金融”与“大数据安全”双剑合璧
  18. speedoffice和office的区别
  19. MetaMask轻钱包教程 修心手把手带你玩小狐狸 钱包小白必备非原创
  20. 外卖cps淘宝客如何实现用户与订单的绑定(附外卖cps带分销返利源码)

热门文章

  1. POPUP_TO_CONFIRM_LOSS_OF_DATA
  2. 2021年茅台销售现新套路,限价控价没有用?
  3. “中国风”拯救国货彩妆?
  4. tia v15 添加项目_西门子S7-1500plc与S7-300plcPN/IO设备通信-创建项目
  5. python类继承可以有多个父类_Python3基础 多重继承 一个子类继承于多个父类
  6. oracle变量最大多少位,oracle – 是否有可能获得变量的最大可能长度
  7. Python正则表达式介绍 re.findall(pattern, str, flag=0)/re.I re.L re.M
  8. Python3各种进制之间的转换方法
  9. Python:函数变量的使用
  10. Python高级数据类型模块collections