为什么调用servlet时会下载无扩展名文件,和ASCII码11有什么关系?
问题原因分析
你遇到的问题核心是两个特性叠加导致的:
- 首先是
PrintWriter的方法逻辑差异:PrintWriter提供的write(int c)方法作用是将输入的int值作为单个ASCII字符输出,而非将int值转为字符串后输出。你传入的11不会输出字符串"11",而是直接输出ASCII码为11的垂直制表符,属于不可打印的控制字符。 - 其次是浏览器的MIME嗅探规则:如果你的Servlet没有显式给
response设置Content-Type响应头,浏览器会自动识别返回内容的类型决定处理方式:正常返回可打印文本内容时,浏览器会识别为text/plain或text/html类型直接在页面渲染;当返回内容中包含不可打印的控制字符时,浏览器会判定该内容不属于可直接渲染的文本类型,归类为未知二进制流,因此触发自动下载行为。
修复方案
- 输出数字类型的变量时,改用
pw.print(11),或者手动转成字符串再调用write方法:pw.write(String.valueOf(11)),这两种写法都会输出字符串"11"而非ASCII控制字符。 - 建议在Servlet业务逻辑执行前,显式设置响应的内容类型,避免浏览器嗅探异常:
response.setContentType("text/html;charset=UTF-8");
内容的提问来源于stack exchange,提问作者DozezQuest
相关产品推荐
相关产品推荐

