GVKun编程网logo

Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB(springboot内嵌tomcat调优)

10

本文将介绍SpringBoot嵌入式Tomcat“application/json”发布请求限制为10KB的详细情况,特别是关于springboot内嵌tomcat调优的相关信息。我们将通过案例分析、

本文将介绍Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB的详细情况,特别是关于springboot内嵌tomcat调优的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于java – spring-boot w /嵌入式tomcat不会向控制器发送请求、Spring Boot application.yml application.properties 优先级、Spring Boot 应用使用 application.yml 和 application.properties 的区别、Spring Boot-替换默认的嵌入式Tomcat连接器的知识。

本文目录一览:

Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB(springboot内嵌tomcat调优)

Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB(springboot内嵌tomcat调优)

我正在使用Spring boot嵌入式tomcat发布休息服务。

Spring Boot版本使用最新的“ 1.3.6.RELEASE”

我要求将application / json发布请求的大小限制为10KB。

厌倦了此解决方案,但不起作用, 在Spring Boot中增加HTTP PostmaxPostSize

请帮忙。

谢谢

答案1

小编典典

配置最大尺寸后仅适用于有要求Content-Typemultipart/form-dataapplication/x-www-form-urlencoded。Tomcat中没有开箱即用的机制来限制具有任何其他内容类型的请求的请求主体的大小,因此您必须编写一些代码。

您可以使用过滤器限制内容长度。例如,将以下类添加到您的Spring Boot应用程序将拒绝与Content-Type兼容application/jsonContent-Length超过10000 的请求:

@Componentstatic class ApplicationJsonRequestSizeLimitFilter extends OncePerRequestFilter {    @Override    protected void doFilterInternal(HttpServletRequest request,            HttpServletResponse response, FilterChain filterChain)                    throws ServletException, IOException {        if (isApplicationJson(request) && request.getContentLengthLong() > 10000) {            throw new IOException("Request content exceeded limit of 10000 bytes");        }        filterChain.doFilter(request, response);    }    private boolean isApplicationJson(HttpServletRequest httpRequest) {        return (MediaType.APPLICATION_JSON.isCompatibleWith(MediaType                .parseMediaType(httpRequest.getHeader(HttpHeaders.CONTENT_TYPE))));    }}

请注意,如果Content-Length标头超过10000个字节(例如,使用分块编码的标头),则此过滤器不会拒绝请求。

java – spring-boot w /嵌入式tomcat不会向控制器发送请求

java – spring-boot w /嵌入式tomcat不会向控制器发送请求

我有一个使用 spring-boot和嵌入式Tomcat容器的应用程序.

据我所知,我的代码与spring-boot sample project相同.但是,当我运行测试时,我得到一个404而不是200(在我尝试发布的情况下,而不是收到一个405,与Tomcat正确设置一致):

Failed tests:
UserControllerTest.testMethod:45 Status expected:<200> but was:<404>

我的基于Java的配置(省略了一些配置类):

@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({ ServiceConfig.class,DefaultRepositoryConfig.class })
public class ApplicationConfig {

    private static Log logger = LogFactory.getLog(ApplicationConfig.class);

    public static void main(String[] args) {
        SpringApplication.run(ApplicationConfig.class);
    }

    @Bean
    protected servletcontextlistener listener() {
        return new servletcontextlistener() {
            @Override
            public void contextinitialized(ServletContextEvent sce) {
                logger.info("ServletContext initialized");
            }

            @Override
            public void contextDestroyed(ServletContextEvent sce) {
                logger.info("ServletContext destroyed");
            }
        };
    }
}

UserController.java:

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

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<String> testMethod() {
        return new ResponseEntity<>("Success!",HttpStatus.OK);
    }
}

UserControllerTest.java:

RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfig.class})
public class UserControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private mockmvc mockmvc;

    @Before
    public void setUp() throws Exception {
        this.mockmvc = mockmvcBuilders.webAppContextSetup(this.webApplicationContext).build();
    }

    @Test
    public void testMethod() throws Exception {
        this.mockmvc.perform(get("/")).andExpect(status().isOk());
    }
}

有没有什么基本的我失踪了?我没有提供自己的Mvc配置,我没有碰到Spring MVC dispatcherServlet,所以我认为spring-boot会自动配置Tomcat.

解决方法

结果是组件扫描配置的问题.即使使用了@ComponentScan注释,控制器也在一个单独的包中,所以Spring从未将它包含在调度程序中.

添加@ComponentScan(basePackages =“com.my.controller”))解决了我的问题.

Spring Boot application.yml application.properties 优先级

Spring Boot application.yml application.properties 优先级

<divid="article_content" data-mod="popu_307" data-dsm="post" data-pid="blog"> <div> <svg xmlns="http://www.w3.org/2000/svg" title="CSDN 认证原创"aria-hidden="true"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#CSDN_Cert" /> </svg>

转载:https://blog.csdn.net/testcs_dn/article/details/79010798

<p>stackoverflow 上有个问题是:<ahref="https://stackoverflow.com/questions/31970576/can-application-properties-and-application-yml-be-mixed" target="_blank" rel="nofollow">Can application.properties and application.yml be mixed?</a></p>

<p>&nbsp;</p>

<p>Spring Boot 虽然做了大量的工作来简化配置,但其配置依然是相当的复杂!</p>

<p> 支持的外部配置方式就高达 17 种之多,当然这很灵活,但灵活就意味着复杂度的提升。</p>

<p>&nbsp;</p>

<p>&nbsp; 这里只说说 & nbsp;application.yml 和 application.properties 两个文件的优先级 </p>

<p>&nbsp;</p>

<p> 如果你的项目中存在 & nbsp;<span>application.properties 文件,</span></p>

<p><span> 那么 & nbsp;<span>application.yml 文件就只是一个摆设。</span></span></p>

<p>&nbsp;</p>

<p><span><span> 为什么这么说呢?</span></span></p>

<p><span><span> 我在 & nbsp;<span>application.properties</span> 文件中配置了:</span></span></p>

<p>server.port=8085</p>

<p>&nbsp;</p>

<p> 在 & nbsp;<span>application.yml 文件中配置了:</span></p>

<p>server:</p>

<p>&nbsp; port: 8086</p>

<p> 启动项目,控制台输出:</p>

<p><span>main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8085 (http)</span></p>

<p> 充分说明了这一点。</p>

<p> 你可能还会关注:<span><strong><a href="http://blog.csdn.net/testcs_dn/article/details/78959700" target="_blank" rel="nofollow">application.properties 文件和 application.yml 文件有什么区别呢?</a></strong></span></p>

<h1><a name="t0"></a>2018-09-26 更新 </h1>

<p> 更新一下对这两个文件的认识,</p>

<p> 其实 & nbsp;<span><span>application.yml </span></span > 文件会被优先加载,</p>

<p> 而如果同时存在 & nbsp;<span>application.properties 文件,并且存在相同的配置,</span></p>

<p><span> 那么则会用 </span>&nbsp;<span>application.properties 文件中的配置覆盖之前的配置;</span></p>

<p><span> 也就是说哪个文件被最后加载,哪个才具有最高级别,</span></p>

<p><span> 因为最后的,会覆盖前面所有的。</span></p>

<h1><a name="t1"></a>2019-02-22 更新 </h1>

<p> 一直比较懒,没去跟踪代码看看底层的究竟;</p>

<p> 关注这个的人还挺多,但何必在这个问题上纠结呢!</p>

<p> 喜欢哪种格式的就用哪种,不要让两种同时存在就好了。</p>

<h1><a name="t2"></a>2019-02-25 更新 </h1>

<p> 有些人可能喜欢追求问题的根源,或者说真相,我这里也看看。</p>

<p> 我的方法:</p>

<p>1、application.properties 文件中加入:</p>

<prename="code"><code>logging.level.root= debug</code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p> 你在 application.yml 中也可以,注意格式。</p>

<p>2、Eclipse 控制台日志输出调大一点,不然可能显示不全 </p>

<p> 控制台窗口空白处右键,首选项 </p>

<p><img width="330" height="427"alt="" src="https://img-blog.csdnimg.cn/20190225171920688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly93ZWl4aWFvLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70"></p>

<p><img width="714" height="620"alt="" src="https://img-blog.csdnimg.cn/20190225171834909.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly93ZWl4aWFvLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70"></p>

<p>3、启动项目 </p>

<p> 查找 & nbsp;application.properties&nbsp; 或者 & nbsp;&nbsp;application.yml</p>

<p> 我这里会看到以下输出:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties''</span> (classpath:/application.properties)</div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml''</span> (classpath:/application.yml)</div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p> 可以看到,从加载顺序上是:先 & nbsp;application.properties&nbsp; 后 & nbsp; application.yml。</p>

<p> 但是这里有一个坑,你接着会看到:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties''</span> (classpath:/application.properties) <span>for</span> profile <span>default</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml''</span> (classpath:/application.yml) <span>for</span> profile <span>default</span></div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p>Skipped (empty) config file xxx for profile default</p>

<p> 我 E 文不好,这是 “跳过(空)配置文件 xxx” 的意思吧?</p>

<p> 我去对应的目录下看了,文件确实存在的,怎么说是空的呢?</p>

<p> 再往下找,往下看:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource <span>''applicationConfig: [classpath:/application.properties]''</span> <span>with</span> search precedence immediately lower than <span>''applicationConfigurationProperties''</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource <span>''applicationConfig: [classpath:/application.yml]''</span> <span>with</span> search precedence immediately lower than <span>''applicationConfig: [classpath:/application.properties]''</span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource <span>''applicationConfigurationProperties''</span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource <span>''defaultProperties''</span></div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p>Adding PropertySource ''applicationConfig: [classpath:/application.yml]'' with search precedence immediately lower than ''applicationConfig: [classpath:/application.properties]''</p>

<p><strong > 这是说 & nbsp;application.yml 的优先级低于 & nbsp;application.properties 吧?</strong></p>

<p> 到这里结果是不是很明确了呢?</p>

<p> 噢,对了,我的版本是:spring-boot-1.5.9.RELEASE</p>

<p> 有很多文章从代码里面分析,搞的我一看就头大;</p>

<p> 我这里只是简单的从日志输出来分析,</p>

<p> 如果你还不满意,可以根据日志输出提示的类,</p>

<p> 跟踪一下,看看代码上具体是怎么实现的!</p> </div>


Spring Boot 应用使用 application.yml 和 application.properties 的区别

Spring Boot 应用使用 application.yml 和 application.properties 的区别

Spring 3.1 引入了新的 @PropertySource 注解作为向环境添加属性源的便捷机制。

我们可以将此注解与 @Configuration 注解结合使用:

@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
    //...
}

注册新属性文件的另一种非常有用的方法是使用占位符,它允许我们在运行时动态选择正确的文件:

@PropertySource({ 
  "classpath:persistence-${envTarget:mysql}.properties"
})

Spring Boot 中的一个常见做法是使用外部配置来定义我们的属性。 这允许我们在不同的环境中使用相同的应用程序代码。

我们可以使用属性文件、YAML 文件、环境变量和命令行参数。

Properties Configuration

默认情况下,Spring Boot 可以访问 application.properties 文件中设置的配置,该文件使用键值格式:

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

这里每一行都是一个单独的配置,所以我们需要通过为我们的键使用相同的前缀来表达分层数据。 在这个例子中,每个键都属于 spring.datasource。

在我们的值中,我们可以使用带有 ${} 语法的占位符来引用其他键、系统属性或环境变量的内容:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

List Structure

如果我们有不同值的同一种属性,我们可以用数组索引来表示列表结构:

application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

YAML Configuration

除了 Java 属性文件,我们还可以在 Spring Boot 应用程序中使用基于 YAML 的配置文件。 YAML 是一种用于指定分层配置数据的便捷格式。

现在让我们从属性文件中获取相同的示例并将其转换为 YAML:

spring:
    datasource:
        password: password
        url: jdbc:h2:dev
        username: SA

如果表达 list 结构,YAML 格式也更加简洁:

application:
    servers:
    -   ip: ''127.0.0.1''
        path: ''/path1''
    -   ip: ''127.0.0.2''
        path: ''/path2''
    -   ip: ''127.0.0.3''
        path: ''/path3''

SAP CAP 基于 SpringBoot 版本的 sample 应用,使用的就是 Application.yml 文件,比如 mock user 的定义:

和帮助文档里的 yml 语法稍稍有些不一样:

Spring Boot-替换默认的嵌入式Tomcat连接器

Spring Boot-替换默认的嵌入式Tomcat连接器

我需要将AJP连接器添加到嵌入式Tomcat并 禁用(或替换) 侦听8080 的默认连接器

我尝试使用EmbeddedServletContainerCustomizer对此进行自定义,但是我无法获得Tomcat对象的句柄来替换在那里创建的默认连接器。结果,除了AJP端口之外,我最终还使用了8080上的http端口。

接下来,我尝试扩展TomcatEmbeddedServletContainerFactory并覆盖其getTomcatEmbeddedServletContainer方法。对于JavaDoc,这似乎是替换默认连接器的理想之地,但最终仍被启用(也不会创建我的AJP连接器)。有什么想法可能会丢失吗?我已经通过调试器验证了我的配置正在运行。

根据下面的答案,这是最干净的解决方案:

@Bean
public EmbeddedServletContainerFactory tomcat() {
    TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();
    myFactory.setProtocol("AJP/1.3");
    myFactory.setPort(9000);
    return myFactory;
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer2() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    connector.setRedirectPort(9001);
                }
            });
        }
    };
}

今天关于Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KBspringboot内嵌tomcat调优的分享就到这里,希望大家有所收获,若想了解更多关于java – spring-boot w /嵌入式tomcat不会向控制器发送请求、Spring Boot application.yml application.properties 优先级、Spring Boot 应用使用 application.yml 和 application.properties 的区别、Spring Boot-替换默认的嵌入式Tomcat连接器等相关知识,可以在本站进行查询。

本文标签: