SpringBoot18-springboot的Web开发-Tomcat配置

来源:互联网 发布:修复ie7软件 编辑:程序博客网 时间:2024/06/05 07:53

        这里讲的tomcat配置,但其实指的是servlet容器的配置,因为Spring Boot默认内嵌的Tomcat为servlet容器,这里的配置对Tomcat,Jetty和Undertow都是通用的

 一:配置Tomcat

     关于Tomcat的所有属性都在org.springframework.boot.autoconfigure.web.ServerProperties配置类中做了定义,我们只需在application.yml配置属性做配置即可。通用的Servlet容器配置都以“server”作为前缀,而Tomcat特有的配置都以“server.tomcat”作为前缀。下面是一些例子:

     配置Servlet容器:

server.port=#配置程序端口,默认为8080

server-session-timeout=#用户会话session过期时间,以秒为单位

server.context-path=#配置访问路径,默认为/



    配置Tomcat:

server.tomcat.uri-encoding=#配置Tomcat编码,默认为UTF-8

server.tomcat.compression=#Tomcat是否开启压缩,默认为关闭off


还有更多可以看文档和网上查找资料。


二:代码配置Tomcat

    如果你需要通过代码的方式配置servlet容器,则可以注册一个实现EmbeddedServletContainerCustomizer接口的Bean;若想直接配置Tomcat,Jetty则可以直接定义TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory

1,通用配置

1)新建类的配置

package com.jack.web.config;import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;import org.springframework.boot.web.servlet.ErrorPage;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/** * 配置servlet容器 */@Componentpublic class CustomServletContainer implements EmbeddedServletContainerCustomizer{    @Override    public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {        //配置端口号        configurableEmbeddedServletContainer.setPort(8888);        //配置错误页面,根据HttpStatus中的错误状态,直接转向错误页面,其中404.html放置在src/main/resources/static下即可        configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/404.html"));        //配置Servlet容器用户会话session过期时间        configurableEmbeddedServletContainer.setSessionTimeout(10, TimeUnit.MINUTES);    }}


2),当前配置文件内配置。若要在当前已有的配置文件内添加类的Bean的话,则在Spring配置中,注意当前类要声明为static:

package com.jack.web;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;import org.springframework.boot.web.servlet.ErrorPage;import org.springframework.http.HttpStatus;import java.util.concurrent.TimeUnit;@SpringBootApplicationpublic class Springboot2webApplication {public static void main(String[] args) {SpringApplication.run(Springboot2webApplication.class, args);}public static class CustomServletContainer implements EmbeddedServletContainerCustomizer{@Overridepublic void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {//配置端口号configurableEmbeddedServletContainer.setPort(8888);//配置错误页面,根据HttpStatus中的错误状态,直接转向错误页面,其中404.html放置在src/main/resources/static下即可configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/404.html"));//配置Servlet容器用户会话session过期时间configurableEmbeddedServletContainer.setSessionTimeout(10, TimeUnit.MINUTES);}}}


2,特定配置

    下面以tomcat为例(Jetty使用JettyEmbeddedServletContainerFactory

@Beanpublic EmbeddedServletContainerFactory servletContainer(){TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();factory.setPort(8888);factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/404.html"));    factory.setSessionTimeout(10,TimeUnit.MINUTES);    return factory;}

三:替换Tomcat

     Spring Boot默认使用Tomcat作为内嵌Servlet容器,查看spring-boot-starter-web依赖,如下:



  如果要使用Jetty或者Undertow为servlet容器,只需修改spring-boot-starter-web依赖即可。


1,替换为Jetty

   在pom.xml中将sring-boot-starter-web的依赖由spring-boot-starter-tomcat替换为spring-boot-starter-jetty:

<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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId><!--<version></version>--></dependency>

   此时启动Spring boot,在控制台输出效果如下:



   要替换Undertow,和替换为Jetty一样,修改pom.xml里面的配置就行了,这里就不举例了。



四:SSL配置

     SSL(Secure Sockets Layer,安全套接层),是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装,压缩,加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol)它建立在SSL记录协议之上,用于在实际数据传输开始前,通信双方进行身份认证,协商和加密算法,交换加密密钥等。

      而基于B/S的Web应用中,是通过HTTPS来实现SSL的。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即在HTTP下加入SSL层,HTTPS的安全基础是SSL。

     因为Spring' Boot用的是内嵌的Tomcat,因而我们做SSL配置的时候需要做如下的操作。

1,生成证书

    使用SSL首先需要一个证书,这个证书可以是自签名的,也可以是从SSL证书授权中心获得的。下面为了演示方便,演示自授权证书的生成。

    没一个JDK或者JRE里都有一个工具叫keytool,它是一个证书管理工具,可以用来生成自签名的证书,如下图:






   在配置了JAVA_HOME,并将JAVA_HOME的bin目录加入到Path后,即可在控制台调用该命令,如下图:




在控制台输入如下命令,然后按照提示操作,如下图:

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore jackkeystore.p12 -validity 3650


1.-storetype 指定密钥仓库类型
2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
3.-keysize 证书大小
4.-keystore 生成的证书文件的存储路径
5.-validity 证书的有效期
参考:http://blog.csdn.net/u012702547/article/details/53790722

  在当前的目录下生成一个jackkeystore.p12文件,这就是我们要的证书文件,如下:



2,Spring Boot配置SSL

    添加一个test.html到src/main/resources/templates目录下,做为测试,将jackkeystore.p12文件复制到项目的根目录,然后在application中做如下SSL配置:



   由于springboot2web是SpringCloudTwo的module,所以把.keystore文件放在SpringCloudTwo目录下,

application.yml的配置如下:

server:  port: 9090  ssl:    key-store: jackkeystore.p12    key-store-password: 123456    key-store-type: PKCS12    key-alias: tomcat




    此时在启动Spring Boot,控制台输出效果如下:




3,测试https

    1)修改pom.xml,目前代码如下,需要添加thymeleaf支持,代码如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jack</groupId><artifactId>springboot2web</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springboot2web</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!--<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>--><!--thymeleaf依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><version>1.5.6.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>


2)test.html代码如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8"/>    <title>index.html</title></head><body>    this is https test!!!!!!!!!!</body></html>

3)编写一个控制器,代码如下:

package com.jack.web.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class IndexController {    @RequestMapping(value = "/test")    public String index(){        return "test";    }}


4)启动项目

    在浏览器输入:https://localhost:9090/test,浏览器显示如下:


4,http转向https

     很多时候我们在地址栏输入http,但是会自动转向到https,例如访问百度的时候.

     要实现这个功能,需要配置TomcatEmbeddedServletContainerFactory,并且添加tomcat的connector来实现。

    这时我们需要在配置文件里增加如下配置:

package com.jack.web;import org.apache.catalina.Context;import org.apache.catalina.connector.Connector;import org.apache.tomcat.util.descriptor.web.SecurityCollection;import org.apache.tomcat.util.descriptor.web.SecurityConstraint;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;import org.springframework.context.annotation.Bean;@SpringBootApplicationpublic class Springboot2webApplication {    public static void main(String[] args) {        SpringApplication.run(Springboot2webApplication.class, args);    }   @Bean    public EmbeddedServletContainerFactory servletContainer() {        //重写上下文设置,添加路径和安全集合        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {            @Override            protected void postProcessContext(Context context) {                SecurityConstraint securityConstraint = new SecurityConstraint();                securityConstraint.setUserConstraint("CONFIDENTIAL");                SecurityCollection collection = new SecurityCollection();                collection.addPattern("/*");                securityConstraint.addCollection(collection);                context.addConstraint(securityConstraint);            }        };        tomcat.addAdditionalTomcatConnectors(httpConnector());        return tomcat;    }    @Bean    public Connector httpConnector() {        //创建一个httpconnector以被使用        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");        connector.setScheme("http");        connector.setPort(8080);        connector.setSecure(false);        //application.yml里面配置的端口        connector.setRedirectPort(9090);        return connector;    }}


此时启动Spring Boot,控制台输出的效果如下:




此时访问:http://localhost:8080/test,会自动转到https://localhost:9090/test如下图:




     总结:这里主要介绍了spring boot配置tomcat容器,和开启ssl实现https进行安全访问的功能。

代码地址:https://github.com/wj903829182/SpringCloudTwo/tree/master/springboot2web



原创粉丝点击