Tomcat配置虛擬主機後的登陸驗證碼問題

  先描述一下問題現象,在本地測試運行一個java web網站,一切正常。但把網站部署到Linux服務器上後,發現登陸出了問題,提示驗證碼輸入不正確。登陸時須要輸入驗證碼,而驗證碼的原值是先存入session中的,而後點擊【登陸】後,會對比用戶輸入的驗證碼與原值,可此時查看日誌發現,從session獲取驗證碼爲null。前端

  起先本人慣性地認爲是代碼的問題,可換了幾種寫法以後,仍然存在這種現象,仔細想了下服務器與本地環境的差別,鎖定了一個點,服務器的域名跟本地是不一樣的,服務器上的tomcat設置了虛擬主機,並使用nginx作了域名的反向代理。這裏假設項目爲siteExample,那麼在本地運行時,url爲「hettp://localhost:8080/siteExample」,在Linux服務器上,爲了構造友好的網址,變爲了「http://www.example.com」。java

  服務器上,指定了/www/apps爲tomcat的項目發佈目錄。而在tomcat的server.xml文件中,關於虛擬主機的配置以下:nginx

<Host appBase="/www/apps" autoDeploy="true" name="www.example.com" unpackWARs="true">
    <Context docBase="/www/apps/siteExample" path="" />
</Host>

   上面的配置中,Context元素的path屬性之因此設爲「」,是爲了去除url中的項目名稱,這樣url就能夠寫爲「http://www.example.com:8080」,而後再利用nginx的反向代理,去除url中的端口號便可。web

  考慮到域名的差別,我又仔細地查看了登陸發送的請求,找了緣由。在jsp頁面裏,咱們寫的資源包括連接的地址都應該是相對於當前url的地址,可前端人員在登陸時發送的請求url寫死了,寫成了「/siteExample/login.do」,很顯然在服務器上運行時,請求的絕對url爲「http://www.example.com/siteExample/login.do」,而最終正確的url應該爲「http://www.example.com/login.do」。驗證碼的原值存在了「http://www.example.com」的會話session中,而登陸請求時,獲取到的會話session是「http://www.example.com/siteExample」的,天然獲取不到驗證碼的原值了。tomcat

  能夠看出,兩個不一樣的域名,指向了相同物理位置的web項目,但產生的是兩個不一樣的session會話。有興趣的話能夠研究下tomcat的運行原理。服務器

相關文章
相關標籤/搜索