使用Tomcat直接配置https繁琐又复杂,而且不能热加载证书,通常网站配置https都是在tomcat前面加一个反向代理程序比如apache、nginx之类得

比如下面这段配置 就是用nginx将本地的8080端口tomcat应用反向代理到了443端口
upstream cms {
#这里填写CMS的真实地址和端口,可使用多行以下配置启用集群
ip_hash;
server localhost:8080 weight=1;
}server {
listen 443 ssl;
server_name www.publiccms.com;
ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
ssl_trusted_certificate chain.pem;
location / {
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
proxy_send_timeout 30;
proxy_read_timeout 10;
proxy_pass http://cms;
}
}
上面的配置中proxy_set_header配置项是将真正的请求协议头,客户ip等信息放在了发给tomcat的请求头中
nginx和tomcat直接是通过http协议通信的,tomcat直接用request.getScheme()方法取协议头拿到的是http
通常大部分程序中取ip的时候 都附带了有限取头信息中X-Real-IP的逻辑,但是协议头一般还是使用的request.getScheme();
需要给tomcat conf/server.xml的Host标签中增加一行配置
<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
然后重启tomcat,tomcat就能从请求头中拿真正的协议头了

