如何使用tomcat 控制项目获取到的request信息

使用自带的tomcat

RemoteIpValve 开发文档

//server.xml: Service -> Engine -> Host -> Valve
 <Valve
   className="org.apache.catalina.valves.RemoteIpValve"
   internalProxies="192\.168\.0\.10|192\.168\.0\.11"
   remoteIpHeader="x-forwarded-for"
   proxiesHeader="x-forwarded-by"
   protocolHeader="x-forwarded-proto"
   />

springboot 使用内置的tomcat

默认使用 tomcat,还可以使用其他 web 服务(如 Jetty, Reactor Netty, Undertow)
服务器命名空间中的配置属性在 application.properties 中的配置项皆以 server 为前缀

1、配置application.properties 文件内容

通过 application.properties 中前缀是 server.tomcat 的配置项,自定义内置tomcat参数。

例如
后端开发者希望获取应用的代理机器IP地址,而不是应用的托管机器的地址。 通常,
将 server.use-forward-headers 设置为true,开启对请求头进行处理,tomcat 会自动利用 org.apache.catalina.valves.RemoteIpValve#invoke,根据一定规则对每个request请求处理。

server.use-forward-headers=true
# 默认为false。当为false时,可以利用TomcatServletWebServerFactory 自定义 RemoteIpValve;

2、自定义扩展WebServerFactoryCustomizer的定制器

当默认的web服务没有我们需要的参数,或需要额外的web server 操作时
通常可以向其添加定制器以配置特定部件,例如连接器,服务器资源或服务器本身 - 所有这些都使用特定于服务器的API。

通过自定义继承了WebServerFactoryCustomizer<web stack >类的 MyWebServerFactoryCustomizer,在 customize 方法中加入 需要的操作逻辑。

@Component
public class MyTomcatWebServerCustomizer
		implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		// customize the factory here
	}
}

web statck 分为 Servlet stack 和 Reactive stack;

  • Servlet stack

  • Reactive stack

3、自定义扩展 WebServerFactory 的组件

它将覆盖Spring Boot提供的组件。 在这种情况下,您不能再依赖服务器命名空间中的配置属性。

// 为tomcat 开启多个 connector
@Bean
public ServletWebServerFactory servletContainer() {
	TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
	tomcat.addAdditionalTomcatConnectors(createSslConnector());
	return tomcat;
}

private Connector createSslConnector() {
	Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
	Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
	try {
		File keystore = new ClassPathResource("keystore").getFile();
		File truststore = new ClassPathResource("keystore").getFile();
		connector.setScheme("https");
		connector.setSecure(true);
		connector.setPort(8443);
		protocol.setSSLEnabled(true);
		protocol.setKeystoreFile(keystore.getAbsolutePath());
		protocol.setKeystorePass("changeit");
		protocol.setTruststoreFile(truststore.getAbsolutePath());
		protocol.setTruststorePass("changeit");
		protocol.setKeyAlias("apitester");
		return connector;
	}
	catch (IOException ex) {
		throw new IllegalStateException("can't access keystore: [" + "keystore"
				+ "] or truststore: [" + "keystore" + "]", ex);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值