通过特定Web容器工厂TomcatServletWebServerFactory定制

1、Pom.xml文件

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.jane</groupId> <artifactId>tralink</artifactId> <version>0.0.1-SNAPSHOT</version> <name>tralink</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

2、Controller文件Test

package com.jane.tralink.controller;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController@RequestMapping("/test")public class Test { @PostMapping("/hello") public String hello(HttpServletRequest request) { System.out.println( request.getHeader("traceid")); return "hello"; }}

3、自定义Web容易定制器

package com.jane.tralink.controller;import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;import org.springframework.boot.web.server.WebServerFactoryCustomizer;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.stereotype.Component;@Componentpublic class MyTomcatCustomize implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { //TraceValve 是实际的增加Header的类 factory.addEngineValves(new TraceValve()); }}

4、TraceValve

package com.jane.tralink.controller;import org.apache.catalina.Valve;import org.apache.catalina.connector.Request;import org.apache.catalina.connector.Response;import org.apache.catalina.valves.ValveBase;import javax.servlet.ServletException;import java.io.IOException;import java.util.UUID;public class TraceValve extends ValveBase { @Override public void invoke(Request request, Response response) throws IOException, ServletException { String uuid = UUID.randomUUID().toString().replaceAll("-", ""); request.getCoyoteRequest().getMimeHeaders().addValue("traceid").setString(uuid); Valve next = getNext(); if(null == next) return; next.invoke(request, response); }}

5、运行结果:http://127.0.0.1:8081/test/hello