您好,登錄后才能下訂單哦!
這篇文章主要介紹“Web應(yīng)用開發(fā)中怎么接收請求地址”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Web應(yīng)用開發(fā)中怎么接收請求地址”文章能幫助大家解決問題。
Web 應(yīng)用開發(fā)中,經(jīng)常會有需要獲取請求的ServerName, 請求端口等, 以此構(gòu)造絕對URL,拿到用戶請求地址,然后進(jìn)行跳轉(zhuǎn),重定向等操作。
也許你說這還不簡單,回字的四種寫法,我有多種方法拿到這個請求地址。
req.getServerName();
req.getRemoteHost();
req.getHeader("host");
req.getRequestURI();
req.getRequestURL().toString();
我們一般要通過請求來封裝一個絕對地址,用上面這幾個方法差不多就可以了,對于http/https 的區(qū)別,可以通過getSchema 來獲取。
那這里拿到的地址一定是實(shí)際用戶輸入的URL嗎?
答案是不確定的。
如果你是使用的一個獨(dú)立的Web Container,比如靜態(tài)資源和 Servlet 都用 Tomcat 來處理,這種 standalone 模式下的,獲取到的 ServerName,是 request直接處理的,直接請求傳遞來的,端口則是 Connector 在監(jiān)聽的端口號。這個時候這些請求方法都能拿到我們想要的內(nèi)容。
但是如果我們把 Tomcat 放到一個 proxy Server 后面,此時,所有的用戶請求都先從代理服務(wù)器過來,此時再在 Java Web 應(yīng)用內(nèi)調(diào)用上述的方法時,你的請求serverName,端口號等實(shí)質(zhì)上想要獲取真實(shí)的用戶請求來的地址,以及端口,而不是 Connector 監(jiān)聽的這個。而且根據(jù) proxy server 配置的不同,你拿到不一定是預(yù)期的結(jié)果。
為啥呢?
從代理服務(wù)器上傳遞過去的請求,以 Nginx 為例,默認(rèn)的 proxy header 中,對于 Host,使用的是 $proxy_host,此時我們拿到的并不是實(shí)際在 Http 的請求頭中傳過去的 Host域,而是我們在配置 proxy_pass 指令時設(shè)置的host,而用戶實(shí)際一般都是通過域名請求來的,這時兩個就會出現(xiàn)不一致的現(xiàn)象。
比如 proxy_pass 配置的是 http://localhost:port這種形式,這個時候在
request.getServerName這些方法時,返回的就是localhost,后面getHeader拿host, 也不會有正確的結(jié)果。
為了能在這種非 Standalone的模式下,能拿到代理服務(wù)器傳遞后依然正確的請求地址,就需要進(jìn)行一些配置。 比如 Apache 中的 ProxyParseHost on, 以及 Nginx 中的 proxy_set_header Host $http_host。
這樣,實(shí)際傳遞到 Java Web 容器的時候就是實(shí)際用戶請求頭中的Host,再據(jù)此拼裝絕對URL就能符合我們預(yù)期。
除了設(shè)置代理服務(wù)器的設(shè)置外, 我們在 Tomcat 這里也可以進(jìn)行一些配置。
在 Connector 組件中,有這樣兩個屬性:
ProxyName
ProxyPort
在文檔中,解釋如下:
如果 Connector 使用在一個代理場景中,
配置這個屬性用于指定調(diào)用 request.getServerName() 方法時返回的 ServerName 和調(diào)用request.getServerPort() 方法返回的 ServerPort。
這樣,即使 代理服務(wù)器傳來的值會變,但是我們在Connector 中根據(jù)具體的約定配置好了值,在獲取時就能以此來拼裝絕對的URL。
而在一些其他編程語言中,有些是會將ServerName 和 Host 區(qū)分開,比如PHP中的,兩個分別拿到不同的信息。
$_SERVER['SERVER_NAME']
$_SERVER['HTTP_HOST']
所以,在構(gòu)造一個絕對URL時,也是需要區(qū)分部署環(huán)境,場景等。
關(guān)于“Web應(yīng)用開發(fā)中怎么接收請求地址”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。