1. 程式人生 > >Nginx SSL+tomcat叢集,request.getScheme() 取到https正確的協議詳解

Nginx SSL+tomcat叢集,request.getScheme() 取到https正確的協議詳解

歡迎掃碼加入Java高知群交流


    公司之前用的是http,但是出於蘋果app稽核和伺服器安全性問題,要改為https,我們公司用的是沃通的ssl,按照沃通的官方文件提供的步驟完成伺服器的配置。 架構上使用了 Nginx +tomcat 叢集, 且nginx下配置了SSL,tomcat 沒有配置SSL,專案使用https協議。


配置成功後明明是https url請求,發現 log裡面,tomcat獲取scheme的時候,一直是http,而不是想像中的https

0415 16:01:10 INFO  (PaymentInterceptor.java:44) preHandle() - requestStringForLog:    {
        "request.getRequestURL():": "http://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6",
        "request.getMethod:": "GET",
        "_parameterMap":         {
            "id": ["212"],
            "s": ["a84485e0985afe97fffd7fd7741c93851d83a4f6"]
        }
    }

request.getRequestURL() 輸出出來的 一直是 

http://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6 

但是瀏覽器中的URL卻是 

https://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6

下面我們進一步研究發現,java API上寫得很清楚:

getRequestURL():

Reconstructs the URL the client used to make the request. 

The returned URL contains a protocol, server name, port number, and server path, 
but it does not include query string parameters.
也就是說, getRequestURL() 輸出的是不帶query string的路經(含協議,埠,server path等資訊).

並且還發現

request.getScheme()  //總是 http,而不是實際的http或https
request.isSecure()  //總是false(因為總是http)
request.getRemoteAddr()  //總是 nginx 請求的 IP,而不是使用者的IP
request.getRequestURL()  //總是 nginx 請求的URL 而不是使用者實際請求的 URL
response.sendRedirect( 相對url )  //總是重定向到 http 上 (因為認為當前是 http 請求)

那麼解決方案有沒有呢,答案是肯定的,其實解決方法非常的簡單,只需要分別配置一下 Nginx 和 Tomcat 就好了,而不用從程式程式碼上修改。

1.配置nginx的轉發項,配置檔案為proxy.conf,內容如下:

proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header Host $host;
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_set_header X-Forwarded-Proto $scheme;起到了關鍵性的作用。

2.配置tomcat,配置檔案為server.xml,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server-xml [
<!ENTITY vhost-localhost SYSTEM "file:///usr/local/tomcat-interface/conf/vhost/localhost.xml">
]>
<Server port="8006" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
  <Listener className="org.apache.catalina.core.AprLifecycleListener"/>

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Connector port="8080"
              protocol="org.apache.coyote.http11.Http11AprProtocol"
              connectionTimeout="20000"
              redirectPort="8443"
              maxThreads="1000"
              minSpareThreads="20"
              acceptCount="1000"
              debug="0"
              disableUploadTimeout="true"
	      useBodyEncodingForURI="true"
              enableLookups="false"
              URIEncoding="UTF-8" />
    <Engine name="Catalina" defaultHost="localhost">
	  <Valve className="org.apache.catalina.valves.RemoteIpValve"
		remoteIpHeader="X-Forwarded-For"
		protocolHeader="X-Forwarded-Proto"
		protocolHeaderHttpsValue="https"/>
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      &vhost-localhost;
    </Engine>
  </Service>
</Server>

其中關鍵的語句為:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>

配置雙方的 X-Forwarded-Proto 就是為了正確地識別實際使用者發出的協議是 http 還是 https。 

配置完成之後以下的請求訪問

request.getScheme() 、request.isSecure() 、request.getRemoteAddr()、request.getRequestURL() 、response.sendRedirect( 相對url ) 

就都變為正確的結果了,就像使用者在直接訪問 Tomcat 一樣。

歡迎掃碼加入Java高知群交流


相關推薦

Nginx SSL+tomcat叢集,request.getScheme() https正確協議

歡迎掃碼加入Java高知群交流     公司之前用的是http,但是出於蘋果app稽核和伺服器安全性問題,要改為https,我們公司用的是沃通的ssl,按照沃通的官方文件提供的步驟完成伺服器的配置。 架構上使用了 Nginx +tomcat 叢集, 且nginx下配置了S

Fiddler抓https設置

谷歌瀏覽器 rom mini make admin 忽略 導入 fiddler抓包 .cn 很多使用fiddler抓包,對於http來說不需太多糾結,隨便設置下就能用,但是抓取https就死活抓不了, 出現諸如以下問題: creation of the root certi

Fiddler抓https設置(圖文)

生成器 oot tro tun 忽略 圖文 htm .com tps 本文主要說明了自己在設置fiddler抓取https過程中所遇到的問題及解決步驟,特別是fiddler在設置證書的環節遇到的各種奇葩問題,特此分享! 聲明:本文為原創文章,轉載請註明來源:https://

(5)HTTPS加密協議

HTTPS加密協議詳解 本文大部分內容來自沃通技術 一、HTTPS基礎知識 HTTPS (Secure Hypertext Transfer Protocol)安全超文字傳輸協議,是一個安全通訊通道,它基於HTTP開發用於在客戶計算機和伺服器之間交換資訊。它使用安全套接字層(

HTTPS加密協議

簡介 HTTPS (Secure Hypertext Transfer Protocol)安全超文字傳輸協議,是一個安全通訊通道,它基於HTTP開發用於在客戶計算機和伺服器之間交換資訊。它使用安全套接字層(SSL)進行資訊交換,簡單來說它是HTTP的安全版,是

Nginx SSL+tomcat集群,request.getScheme() https正確協議

port nor tom com () not request 一個 header 轉自:http://feitianbenyue.iteye.com/blog/2056357 最近在做一個項目, 架構上使用了 Nginx +tomcat 集群, 且nginx下配置了

Nginx SSL+tomcat集群,不到https正確協議

分享 安裝目錄 remote 瀏覽器 架構 解決方案 name head 文件 最近在做一個項目, 用到企業微信,架構上使用了 Nginx +tomcat 集群, 且nginx下配置了SSL,tomcat no SSL,項目使用https協議,但是在調試微信菜單的相關功能時

利用nginx搭建tomcat叢集

一、安裝tomcat tomcat安裝不做介紹,在每臺伺服器上都安裝tomcat即可! 二、安裝nginx yum安裝nginx 三、修改nginx的配置檔案 yum安裝後,nginx的配置檔案在/etc/nginx下面 可以執行指令: vim /etc/nginx/

Nginx SSL證書部署,開啟全站HTTPS訪問(多域名)

我們都知道,現在已經進入了HTTPS時代,連搜尋引擎都會專門為HTTPS網站的索引進行加權。HTTPS的主要特點是更安全,雖然有可能會讓我們的訪問變得稍慢一些,但是保證安全以及與時俱進聽起來很有吸引力。 下面我們就以從騰訊雲申請的免費SSL證書為例,演示下如何通過nginx為我們的網

NginxTomcat : 413 Request Entity Too Large(請求實體太大)

最近開發時遇到了上傳失敗的情況 , 看日誌居然顯示post請求實體過大. 然後查了查資料 , 修改代理伺服器Nginx 和 伺服器Tomcat的相關配置 **1.**Nginx 作為反向代理伺服器 , nginx最先收到client請求 ,一定會有一些限制

windows下通過nginx實現tomcat叢集負載均衡(入門)

一、目標 Windows下,下載安裝nginx Nginx常用命令 Nginx負載均衡兩個tomcat Nginx配置多個負載均衡服務 二、下載安裝nginx 下載地址http://nginx.org/en/download.html 版本nginx-1.

linxu下部署nginxSSL證書(HTTPS)依賴模組與使用nginx.conf配置https協議

一:開始Nginx的SSL模組1.1 Nginx如果未開啟SSL模組,配置Https時提示錯誤1nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/n

ubuntu nginx+redis+tomcat叢集配置

一.環境介紹 Linux: ubuntu16.04 64位系統 Nginx: 版本1.13.0 Tomcat: 版本7.0 Redis: 3.0.4 使用nginx做負載均衡, 2臺tomca

NginxTomcat叢集部署

目錄 1.安裝規劃 2.系統概述 2.1 硬體 2.2軟體 2.3安裝順序 3.軟體獲取 3.1Tomcat下載 3.2Nginx下載 4.Tomcat安裝 4.1JAVA環境配置 4.2 Tomcat安裝 4.2.1 Tomcat埠修改 4.2.2 啟動tomcat 5

HTTPS協議(二):TLS/SSL工作原理

-c 基本 公鑰加密 工作方式 通信 使用 sha2 公開 原理 HTTPS協議的主要功能基本都依賴於TLS/SSL協議,本節分析TLS/SSL協議工作原理。 TLS/SSL的功能實現主要依賴於三類基本算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實

HTTPS協議(四):TLS/SSL握手過程

其它 對數 hello 減少 受保護 改版 text gin 組裝 1、握手與密鑰協商過程 基於RSA握手和密鑰交換的客戶端驗證服務器為示例詳解TLS/SSL握手過程 再看一張手繪時序圖 (1).client_hello 客戶端發起請求,以明文傳輸請求信息,包

HTTPS協議(三):PKI 體系

客戶 判斷 節點 無法 三方 證書無效 進行 證書 roo 1、RSA身份驗證的隱患 身份驗證和密鑰協商是TLS的基礎功能,要求的前提是合法的服務器掌握著對應的私鑰。但RSA算法無法確保服務器身份的合法性,因為公鑰並不包含服務器的信息,存在安全隱患: 客戶端C和

FastDFS分布式文件系統&Nginx負載均衡最小環境安裝配置[超級

nbsp strong figure 分割 不能訪問 org 事先 zlib 編輯 1、背景 FastDFS 是一款開源的、分布式文件系統(Distributed File System),由淘寶開發平臺部資深架構師余慶開發。該開源項目的主頁是 http://code.go

幹貨 | Tomcat 連接數與線程池

非阻塞 取出 http1 pri num 應用層 close wait 支持 前言 在使用tomcat時,經常會遇到連接數、線程數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的連接器(Connector)。 在前面的文章 詳解Tomcat配置文件server.

我的網站HTTPS改造全程

一直用的是360瀏覽器管理自己的網站,有一次在朋友電腦用谷歌瀏覽器檢視自己的網站,發現谷歌瀏覽器在網站位址列前面標註不安全,還以為網站出啥漏洞了,後來發現是虛驚一場,原因是谷歌對未安裝SSL證書的網站都提示安全風險,後來查了一大堆資料,發現很多關於HTTP和HTTPS的介紹,大致就是下面的幾種說法: &nb