Nginx+Tomcat Session 無效問題


  • omcat 和 Nginx 是相互獨立的,在創建 Session 的時候,會根據部署的 Path 作為 Session Cookie 的 Path 路徑,原則就是解決 Session Path 路徑問題,Session 的本質還是 Cookie。
  •  

    最近研究了一下 Nginx 做反向代理的問題,由於不熟悉走了不少彎路。現把問題記錄下來,日后作為參考。結構采用 Nignx + Tomcat 的方式,程序是用 Java 編寫的 Web 應用,之前一直都運行的很好,做服務器遷移之后,用 Nginx 做反向代理,綁定域名。代理之后發現系統的登錄不能用了,登錄之后在 Session 中存的內容,在判斷的時候總是取不到。經過一段時間的摸索,發現問題出在了 Session 的 Path 路徑上。其實 Session 是在服務器端生成的,但識別客戶端的本質還是通過 Cookies 服務器端創建 Session 會通過 Response 的 Set-Cookie: JSESSIONID=XXXXXXXXXXXXXXXXX; Path=/xxxxx 向客戶端寫 Cookies 而 Cookies 有個特點就是通過請求路徑有選擇的提交 Cookie 依據就是 Path 只有路徑之后的會提交 Cookie 值。

    好了,問題就出在這里,Tomcat 和 Nginx 是相互獨立的,在創建 Session 的時候,會根據部署的 Path 作為 Session Cookie 的 Path 路徑,例如: 127.0.0.1:8080/test 那么 Path=/test 。 Nginx 反向代理綁定域名之后,我們希望看到的是 http://www.example.com 而不是 http://www.example.com/test 因此解決的辦法就是解決 Path 的差異。

    第一,訪問的時候添加 uri “/test”。修改 Nginx 配置。

    第二,解決 Tomcat 中應用的發布路徑,將應用的發部路徑改為根目錄即,Path=""。

    第三,$TOMCAT_HOME/conf/server.xml 中的 protocol="HTTP/1.1" 協議的 Connector 節點上添加 emptySessionPath="true" 默認為 false(此方法本人未驗證,理論上是可行的)。

        關於 emptySessionPath="true" 的解釋,Tomcat 官網解釋如下:If set to true, all paths for session cookies will be set to /. This can be useful for portlet specification implementations, but will greatly affect performance if many applications are accessed on a given server by the client. If not specified, this attribute is set to false.

    總之,原則就是解決 Session Path 路徑問題,Session 的本質還是 Cookie。

  •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM