Tomcat

Apache httpd mod_rewrite 與 Tomcat 導致失去 JSESSIONID

  • September 28, 2019

我正在開發一個 Java Web 應用程序,我最近為此實現了一個身份驗證模組,該模組依賴於 JSESSIONID cookie 來辨識使用者。我在 eclipse 的本地 tomcat 上進行測試,一切正常……直到我在我們的 VPS(Centos)上部署了應用程序,並使用了一些更高級的設置結構:

  • Apache HTTP 伺服器
  • 幾個虛擬主機
  • 所述 webapp 安裝在帶有 mod_jk 的虛擬主機中。它目前通過“sub.hostname.com/WEBAPP_NAME/home”訪問,但應該可以通過“sub.hostname.com/home”訪問。

在身份驗證更新之前,上述設置並不是什麼大問題(順便說一句,之前訪問是由 tomcat 的安全選項處理的)。舊的 VirtualHost 看起來像這樣並且工作正常:

<VirtualHost *:80>
   ServerName sub.hostname.com
   RewriteEngine on
   RewriteRule ^/(.+)$ /WEBAPP_NAME/$1 [L,PT]
   RewriteRule ^/$ /WEBAPP_NAME/home [L,PT]
   JkMount /* worker
</VirtualHost>

**問題:**部署後,身份驗證不起作用,因為未寫入 JSESSIONID cookie。我刪除了 RewriteRules 並通過“sub.hostname.com/WEBAPP_NAME/home”訪問了應用程序,一切正常,我收到了一個 cookie。從這些觀察中,我猜這個問題是因為 URL 被重寫並且 Servlet 沒有將 cookie 寫入正確的路徑(?)如果是這種情況,我是否應該嘗試將 cookie 從應用程序中寫入其他路徑?

在 apache 或 tomcat 中是否有任何特定的設置可以處理這個問題?還是我最初選擇了錯誤的設置架構?

在閱讀了 CédricC 的建議後,我做了更多的研究,發現:Configuring Apache, Tomcat, mod_jk and mod_rewrite to serve up tomcat from top-level

我按照 Kevin Loney 的說明使用mod_headers模組直接從 Apache修改 http 標頭。

最後,我只需要將以下行添加到我的 VirtualHost 配置中,它將所有 cookie 路徑從更改/WEBAPP_NAME/ (root)

Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2

替代方法 - 從 Tomcat 更改 cookie 路徑:

我還測試了在我的應用程序的 web.xml 中設置來自 Tomcat 的 cookie 路徑:

<session-config>
   <session-timeout>30</session-timeout>
   <cookie-config>
       <http-only&gt;true&lt;/http-only>
       &lt;path&gt;/&lt;/path&gt; &lt;!-- changes the path --&gt;
       &lt;name&gt;COOKIENAME&lt;/name&gt;
   &lt;/cookie-config&gt;
&lt;/session-config&gt;

從https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-on-jetty的問題中獲得了 web.xml 範例

引用自:https://serverfault.com/questions/604441