写入的响应头的数据超出缓Increase maxHttpHeaderSize on the connector or write less data into the response headers

本文详细解析了在使用Tomcat服务器进行文件上传时遇到的HeadersTooLargeException异常,该异常通常由响应头数据超出缓冲区限制引起。文章提供了具体的错误日志和调用堆栈,并给出了明确的解决方案,即通过修改server.xml中Connector元素的maxHttpHeaderSize属性来增大缓冲区大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写了带有文件上传的项目遇到的坑

报错问题:

严重: Servlet.service() for servlet [springServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.coyote.http11.HeadersTooLargeException: An attempt was made to write more data to the response headers than there was room available in the buffer. Increase maxHttpHeaderSize on the connector or write less data into the response headers.] with root cause
org.apache.coyote.http11.HeadersTooLargeException: An attempt was made to write more data to the response headers than there was room available in the buffer. Increase maxHttpHeaderSize on the connector or write less data into the response headers.
    at org.apache.coyote.http11.AbstractOutputBuffer.checkLengthBeforeWrite(AbstractOutputBuffer.java:547)
    at org.apache.coyote.http11.AbstractOutputBuffer.write(AbstractOutputBuffer.java:511)
    at org.apache.coyote.http11.AbstractOutputBuffer.write(AbstractOutputBuffer.java:428)
    at org.apache.coyote.http11.AbstractOutputBuffer.sendHeader(AbstractOutputBuffer.java:394)
    at org.apache.coyote.http11.AbstractHttp11Processor.prepareResponse(AbstractHttp11Processor.java:1540)
    at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:773)
    at org.apache.coyote.Response.action(Response.java:174)
    at org.apache.coyote.Response.sendHeaders(Response.java:365)
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:352)
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:333)
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101)
    at com.opensymphony.module.sitemesh.filter.RoutableServletOutputStream.flush(RoutableServletOutputStream.java:122)
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1045)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1821)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:204)
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:90)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189)
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)

主要问题描述的是:写入的响应头的数据超出缓冲区限制的大小,建议修改maxHttpHeaderSize的值,或者减少响应头的数据!

解决方案:

找到tomcatan'z安装目录下的 sever.xml

修改内容

把maxHttpHeaderSizesh,设置变大就好了。

<Connector port="8081" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />

在Spring MVC框架中,`ResponseEntity`是一个重要的类,它用于封装HTTP响应,包括状态码、头信息以及响应体内容。当你需要返回一个包含自定义头和输入流资源(如文件或流数据)的HTTP响应时,你可以这样做: ```java import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.multipart.MultipartFile; @GetMapping("/download") public ResponseEntity<InputStreamResource> downloadFile(@RequestParam("file") MultipartFile file) { try { if (file.isEmpty()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) .headers(responseHeaders) .body(null); // 返回一个空的InputStreamResource } InputStream inputStream = file.getInputStream(); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); responseHeaders.setContentDispositionFormData("filename", file.getOriginalFilename()); return ResponseEntity.ok() .headers(responseHeaders) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new InputStreamResource(inputStream)); // 返回包含文件内容的InputStreamResource } catch (IOException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } } ``` 在这个例子中,我们从请求中获取MultipartFile,检查文件是否为空,然后创建一个`InputStreamResource`来包装输入流,并设置适当的HTTP头信息(如Content-Type和Content-Disposition)。最后,通过`ResponseEntity.ok()`返回这个`InputStreamResource`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值