zoukankan      html  css  js  c++  java
  • Spring Boot项目的内嵌容器

    一、关于容器

    刚才开始使用spring boot的开发者会有种很直观的感觉,servlet容器“不见了”。之前开发web项目,都是把程序写完后部署到servlet容器(比如Tomcat),但是使用spring boot开发项目,写完程序后直接就能运行了,觉得些许奇怪! 其实呢,这是因为Spring Boot中内嵌了Tomcat、Jetty和Undertow服务器。之所以开发者在默认情况下不需要做任何配置,是因为spring boot提供了一个名为EmbeddedServletContainerAutoConfiguration的配置类 (@Configuration注解的类),spring boot能实现“零配置”,是因为spring定义了好多这样的配置类(配置没有少,只是以前由开发者自己的工作交由spring完成了),这种情况下大多数开发人员将只需使用适当的“启动器”来获得一个完全配置的实例。spring-boot-starter-web默认使用嵌套式的Tomcat作为Web容器对外提供HTTP服务,默认端口8080对外监听和提供服务。但同样可以使用spring-boot-starter-jetty或者spring-boot-starter-undertow作为Web容器。

        注意:如果您选择在CentOS上使用Tomcat,默认情况下临时目录是用于存储已编译的jsp、文件上传等。当应用程序运行导致失败时,该目录可以就被tmpwatch删除。为了避免这一点,您可能需要定制您的tmpwatch配置。通过使用server.tomcat.basedir来配置内嵌的Tomcat。

     1)内嵌容器选择

    • 在pom文件中排除tomcat的starter
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <exclusions>
          <exclusion>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-tomcat</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    
    • 增加Jetty依赖
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

     


    2)改变默认的配置端口,可以在application.properties中指定:

    server.port = 9000(the port number you want)

    3)类似的配置还有:

    server.address
    server.ssl.*
    server.tomcat.*
    

    如果上诉仍然没有办法满足要求,springBoot支持对嵌入式的Web容器实例进行定制,可以通过向IoC容器中注册一个EmbeddedServletContainerCustomizer类型的组件来对嵌入式的Web容器进行定制

    public class UnveilSpringEmbeddedTomcatCustomizer implements EmbeddedServletContainer{
            public void customize(ConfigurableEmbeddedServletContainer container){
                container.setPort(9999);
                container.setContextPath("C\hello");
                               ...
            }
        }
    

     

    二、关于servlet、 Filters、listeners

           在使用嵌入式servlet容器时,您可以注册servlet、 Filters、listeners 。Servlet规范要么使用Spring bean,要么通过扫描Servlet组件。

    1.通过Spring Bean注册servlet、 Filters、listeners

    默认情况下,如果上下文只包含一个Servlet,它将被映射到/。在多个情况下。Servlet bean bean的名称将用作路径前缀。过滤器将映射到/*。

    如果基于约定的映射不够灵活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。

    Spring Boot附带了许多可以定义过滤器bean的自动配置。下面是一些过滤器的例子和它们各自的顺序(低order value意味着更高的优先级):

    Servlet FilterOrder
    OrderedCharacterEncodingFilter
    Ordered.HIGHEST_PRECEDENCE
    WebMvcMetricsFilter
    Ordered.HIGHEST_PRECEDENCE + 1
    ErrorPageFilter
    Ordered.HIGHEST_PRECEDENCE + 1
    HttpTraceFilter
    Ordered.LOWEST_PRECEDENCE - 10

    通常,让过滤bean处于无序状态是安全的。

    如果需要特定的顺序,您应该避免筛选器程序读取请求的Ordered.HIGHEST_PRECEDENCE值。因为它可能违背应用程序的字符编码配置。如果Servlet筛选器包装请求,它应该配置一个小于或等于FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER的顺序。

     



  • 相关阅读:
    Android Studio Gradle 添加.so 支持文件
    poj 3270 更换使用
    linux通过使用mail发送电子邮件
    php 上传文件 $_FILES['']['type']的值
    浅谈Base64编码
    expect实现ssh自动登录
    C++ 多源码文件简单组织
    linux下修改hostid
    SQLite/嵌入式数据库
    类内数组声明,“类外”指定大小
  • 原文地址:https://www.cnblogs.com/BlogNetSpace/p/9584506.html
Copyright © 2011-2022 走看看