Spring Boot中的max-http-header-size配置

Posted 融极

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot中的max-http-header-size配置相关的知识,希望对你有一定的参考价值。

概述

默认情况下,Spring Boot Web 应用程序包括一个预配置的嵌入式 Web 服务器。但是,在某些情况下,我们希望修改默认配置以满足自定义要求。
在本教程中,讲解如何在 Spring Boot 2.x 应用程序的application.properties文件中对请求标头进行设置和使用max-http-header-size属性。

Max-HTTP-Header-Size

Spring Boot 支持Tomcat、Undertow和Jetty作为嵌入式服务器。通常,我们在 Spring Boot 应用程序中的application.properties文件或application.yaml文件中进行服务器配置。
大多数 Web 服务器都有自己的一组 HTTP 请求header大小限制。HTTP header值受服务器实现的限制。在 Spring Boot 应用程序中,最大 HTTP header大小是使用server.max-http-header-size 配置的。
Tomcat和Jetty的实际默认值为8kB,Undertow的默认值为1MB。
要修改最大 HTTP header大小,在application.properties文件中进行如下配置:

server.max-http-header-size=1024000

从 Spring Boot 2.1 开始,可使用DataSize可解析值:

server.max-http-header-size=10KB

请求头太大

假设发送的请求的总 HTTP header大小大于max-http-header-size值。服务器以“400 Bad request”错误拒绝请求。在下一个示例中,我们将在日志文件中看到此错误。
让我们创建一个控制器,它有一个名为 token 的header属性:

@RestController
@RequestMapping(value = "/request-header-test")
public class MaxHttpHeaderSizeController 
    @GetMapping
    public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) 
    return true;
    

接下来,让我们向application.properties文件添加一些属性:

## Server connections configuration
server.tomcat.threads.max=200
server.connection-timeout=5s
server.max-http-header-size=8KB
server.tomcat.max-swallow-size=2MB
server.tomcat.max-http-post-size=2MB

当我们在token中传递一个大小大于 8kb的字符串值时,得到 400 错误,如下所示:

spring-boot:我可以修复 spring-boot 2 中的下一个错误吗?

【中文标题】spring-boot:我可以修复 spring-boot 2 中的下一个错误吗?【英文标题】:spring-boot: can i fix next error in spring-boot 2? 【发布时间】:2019-05-01 19:28:55 【问题描述】:

我有这个代码:

@RestController
@RequestMapping("/user")
public class UserController 

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET,value = "/login")
    public ResponseEntity<User> getUser(@RequestBody User user) 

        if (userService.findByEmailAndPassword(user.getUsername(), user.getPassword()) !=null) 
            return new ResponseEntity<User>(user, HttpStatus.OK);
        
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);

   

当我尝试在 swegger 中使用 ths 方法时,会显示下一个错误: 我不知道如何解决这个错误,我需要帮助! 此方法用于登录android-app,但尚未准备好使用


  "timestamp": 1543509200623,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
  "message": "Required request body is missing: public org.springframework.http.ResponseEntity<edu.utcluj.track.user.User> edu.utcluj.track.user.UserController.getUser(edu.utcluj.track.user.User)",
  "path": "/user/login"

【问题讨论】:

【参考方案1】:

在我看来,您需要在 POST 请求中将 User 对象作为请求正文发送。它没有找到请求正文,因为您使用的是未发送请求正文的 GET 请求。

【讨论】:

以上是关于Spring Boot中的max-http-header-size配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

Spring Boot2 系列教程Spring Boot 中的静态资源配置

内存数据库spring-boot中的h2

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

Spring Boot 实践折腾记:Spring Boot中的容器配置和SSL支持

Spring Boot 中的事务同步