GVKun编程网logo

使用Spring Boot在嵌入式Tomcat服务器上部署资源(spring boot内嵌tomcat)

15

此处将为大家介绍关于使用SpringBoot在嵌入式Tomcat服务器上部署资源的详细内容,并且为您解答有关springboot内嵌tomcat的相关问题,此外,我们还将为您介绍关于java–如何使用

此处将为大家介绍关于使用Spring Boot在嵌入式Tomcat服务器上部署资源的详细内容,并且为您解答有关spring boot内嵌tomcat的相关问题,此外,我们还将为您介绍关于java – 如何使用spring boot和嵌入式tomcat禁用TLSv1.0?、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat、Spring Boot嵌入式Tomcat性能的有用信息。

本文目录一览:

使用Spring Boot在嵌入式Tomcat服务器上部署资源(spring boot内嵌tomcat)

使用Spring Boot在嵌入式Tomcat服务器上部署资源(spring boot内嵌tomcat)

我有一个项目,其中将来自多个来源的数据处理为某些数据结构。程序完成这些结构的构建后,我希望它建立一个服务器,使用户可以手动微调这些结构。我认为使用Spring
Boot设置的嵌入式Tomcat服务器上的Spring MVC正是我所需要的。

我想使用Thymeleaf作为查看技术,因此

@Configuration@ComponentScan@EnableAutoConfigurationpublic class Main {    public static void main(String... args) throws Exception {        // Lots of initialization ...        SpringApplication.run(Main.class, args);    }    @Bean    public ServletContextTemplateResolver templateResolver() {        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();        resolver.setPrefix("/resources/views/");        resolver.setSuffix(".html");        resolver.setTemplateMode("HTML5");        resolver.setCacheable(false);        return resolver;    }    public SpringTemplateEngine templateEngine() {        SpringTemplateEngine engine = new SpringTemplateEngine();        engine.setTemplateResolver(templateResolver());        return engine;    }    @Bean    public ViewResolver viewResolver() {        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();        viewResolver.setTemplateEngine(templateEngine());        viewResolver.setOrder(1);        viewResolver.setViewNames(new String[]{"*"});        viewResolver.setCache(false);        return viewResolver;    }}

@Controllerpublic class WebController {    @RequestMapping(value="/greeting", method=RequestMethod.GET)    public String greeting() {        return "greeting";    }}

但是,即使在处有一个查看文件/resources/views/greeting.html,服务器对URL的回复http://localhost:8080/greeting也是

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "greeting", template might not exist or might not be accessible by any of the configured Template Resolvers

在调试器中单步执行代码后,似乎在某个时候ServletContext(应该以流的形式返回视图文件)看起来像这样的临时文件夹

C:\Users\Michael\AppData\Local\Temp\tomcat-docbase.971027024999448548.8080

这是空的。

现在我知道我需要

  1. 服务器启动时将资源部署到临时文件夹

  2. 让服务器在资源已经存在的目录中运行

我的问题是我既不知道怎么做,也不知道哪种方法最好。有人告诉我1是更好的智慧,但是任何建议都是值得欢迎的。

编辑

好的,我最终得到了一些可行的方法。虽然Joe的回答无疑帮助我前进,但似乎我不得不以一种使我感到困惑的方式更改Maven配置。

将模板greeting.html放入/resources/templates/greeting.html并添加resources到构建路径后,出现错误

javax.servlet.ServletException: Circular view path [greeting]: would dispatch back to the current handler URL [/word/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

换句话说,Thymeleaf似乎配置不正确。经过一番摆弄之后,我最终将spring-boot-starter-parentin
的版本pom.xml从更改0.5.0.BUILD-SNAPSHOT0.5.0.M6

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <!--<version>0.5.0.BUILD-SNAPSHOT</version>-->    <version>0.5.0.M6</version></parent>

并从Thymeleaf依赖项中删除版本标签

<dependencies>    <!-- ... -->    <dependency>        <groupId>org.thymeleaf</groupId>        <artifactId>thymeleaf-spring3</artifactId>        <!--<version>${thymeleaf-spring3-version}</version>-->    </dependency></dependencies>

在此之后,它起作用了。

有人可以解释一下为什么我需要更改的版本spring-boot-starter-parent才能从中删除版本标签thymeleaf-spring3,为什么这样做是必要的?

答案1

小编典典

servlet上下文根不是嵌入式服务器中模板的最佳位置。有一种方法可以做到,但是如果我是我,我会顺其自然,并使用类路径。如果允许Spring
Boot配置模板解析器(也建议使用),则classpath:/templates默认情况下它将进入。在引导代码库中有几个使用百里香的示例,因此,如果您有不同的要求,则应该很容易地修改其中的一个。

java – 如何使用spring boot和嵌入式tomcat禁用TLSv1.0?

java – 如何使用spring boot和嵌入式tomcat禁用TLSv1.0?

我想用 spring boot(版本1.3.3)取消激活TLSv1.0,但如果application.yml如下所示它不起作用:

SSL:
    协议:TLSv1.2
    key-store:/E:/key/server.jks
    密钥存储密码:serverpkcs12

如果只在IE中选择“USE TLS 1.0”,我仍然可以访问网页.
See this pic–not work.

但是,如果不使用嵌入式tomcat,并为位于server.xml中的Connector添加这些参数,它对我来说很好 – IE阻止的网页. See this pic–worked for me

sslProtocols =“TLSv1.2”sslEnabledProtocols =“TLSv1.2”

我也尝试了一些VM参数,例如-Dhttps.protocols =“TLSv1.2”,它们都是无用的.

那我该怎么办呢?

解决方法

我找到的方法是设置仅由TLSv1.2支持的密码.例如:如果您将放入application.yml

server.ssl.ciphers:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

并使用CURL

openssl s_client -connect example.com:443 -tls1

您将看到该请求将被忽略/拒绝,因为您在application.yml中设置的密码将仅验证TLSv1.2请求.

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

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

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

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

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

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

@Beanpublic EmbeddedServletContainerFactory tomcat() {    TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();    myFactory.setProtocol("AJP/1.3");    myFactory.setPort(9000);    return myFactory;}@Beanpublic 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);                }            });        }    };}

答案1

小编典典

您可以使用将A TomcatConnectorCustomizer连接器添加到中,以将其配置为使用AJP
TomcatEmbeddedServletContainerFactory

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

我正在编写一个Spring
Boot应用程序,该应用程序使用几个@Configuration类之一,具体取决于文件中@Profile设置的类application.properties

这些配置类之一使用REST接口,因此,我将其包括spring-boot-starter-web为依赖项。

这将启动嵌入式Tomcat实例,这很好。

问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入消息而不是REST)。

有没有什么方法可以阻止@SpringBootApplicationTomcat在默认情况下启动,而仅将其用于REST
Configuration类?例如,通过用@EnableWebMVC

这是我的@Configuration课程的示例:

休息:

@Profile({"REST"})@Configuration@EnableWebMvcpublic class HttpConfiguration{ . . .}

JMS:

@Profile({"JMS"})@Configuration@EnableJmspublic class JMSConfiguration{ . . .}

谢谢

答案1

小编典典

采用

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,                                   WebMvcAutoConfiguration.class})

排除Spring Boot对嵌入式servlet容器的自动配置。另外,您需要为非REST案例设置以下属性,以使Spring Boot不会尝试启动REST
WebApplicationContext(需要一个servlet容器):

spring.main.web-environment=false

然后通过导入在REST配置文件中启用嵌入式Tomcat
EmbeddedServletContainerAutoConfiguration.class(这将自动配置延迟到REST配置文件加载后:

@Profile({"REST"})@Configuration@Import(EmbeddedServletContainerAutoConfiguration.class)public class HttpConfiguration {    // ...}

如果使用任何EmbeddedServletContainerCustomizer,还需要导入EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class

Spring Boot嵌入式Tomcat性能

Spring Boot嵌入式Tomcat性能

我正在为我的应用程序开发Microservices API.我从Spring Boot应用程序开始.我创建了两个工件 – “嵌入式tomcat的业务代码”和“没有嵌入式tomcat的业务代码”.

当我比较性能结果时,我可以看到“非嵌入式tomcat”(即在独立的tomcat上执行)由于本机执行而提供了良好的输出.

那么基本上嵌入式tomcat和独立tomcat之间的区别是什么呢?

两次执行之间的表现有何不同?

最佳答案
我找到了这个问题的根本原因.

APR(Apache Portable Runtime)在tomcat线程执行中起着重要作用.

默认情况下,嵌入式tomcat执行NIO. NIO和BIO是基于Java的执行,而APR是本机执行.当我们比较NIO和APR的性能时,APR要快得多.

事实上,所有基于Linux的tomcat包都附带了tomcat lib文件夹下的APR库.

在嵌入式tomcat(即Spring Boot)中启用APR后,与独立的tomcat相比,性能执行相同.

http://tomcat.apache.org/tomcat-7.0-doc/apr.html

今天的关于使用Spring Boot在嵌入式Tomcat服务器上部署资源spring boot内嵌tomcat的分享已经结束,谢谢您的关注,如果想了解更多关于java – 如何使用spring boot和嵌入式tomcat禁用TLSv1.0?、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat、Spring Boot嵌入式Tomcat性能的相关知识,请在本站进行查询。

本文标签: