2009-01-12 14 views
12

我目前運行具有以下屬性的應用程序:支持沒有餅乾會議在Tomcat中

    基於Java
  • 與Spring和Acegi的
  • 運行在Tomcat 5

我需要的能力支持用戶會話沒有餅乾。有人能請我指出正確的方向嗎?

謝謝。

+1

不應該這項工作出在Tomcat的盒子?servlet容器應該設置一個請求參數JSESSIONID在第一次使用會議,一個d如果客戶端沒有發回一個響應信號,表明它接受cookie,容器應該繼續使用這個參數......我想。 – 2009-01-12 19:56:31

回答

18

完全回答這個問題是所有響應的組合,所以我要總結一下:

  1. 沒有必要設置cookies =「假」在context.xml文件。理想的功能是讓tomcat使用它的基於url的會話標識,如果用戶不支持cookies,默認情況下會使用它。

  2. 當用戶沒有啓用cookie時,tomcat將通過請求的url中的「JSESSIONID」參數標識會話。一對夫婦的樣本網址如下 http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 通知會話ID是多麼的不URL查詢字符串的一部分(這是一個J2EE標準)

  3. 爲了保證JSESSIONID參數被添加到您的所有要求網址,你不能有簡單的網址引用。例如,在JSTL中,您必須使用< c:url>。如果有必要,servlet引擎會自動將jsessionid附加到url。這裏有一個例子:

    <% - 這是不好的: - %> < A HREF = 「page.html中」>鏈接</A>

    <% - 這是件好事: - %> < a href =「< c:url value ='page。HTML「/> 」>鏈接</A>

+0

如果我使用ajax調用,該怎麼做? (不是href鏈接) – maximus 2016-06-17 12:45:27

0

您可以通過IP地址追蹤,但代理服務器(和NAT?)可能把你弄得一團糟。

您可以強制所有URL將會話作爲參數,將所有表單作爲隱藏字段。也許生成URL的自定義標籤可以幫助在這裏,但我沒有做了很多工作,標籤庫。

你需要考慮安全性 - 人們可能會發郵件聯繫給別人使用它的會話ID,所以你會希望有一個IP地址檢查每個進入檢查地址的會話匹配。

+0

我建議不要使用IP地址跟蹤VPN。這個答案是舊的,所以我不會downvote,但我強烈建議反對這個爲未來的回答lookers。 – azdragon2 2016-03-11 00:27:04

4

請參閱http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

在文件META-INF/context.xml中,

<?xml version='1.0' encoding='UTF-8'?> 
<Context path='/myApplicationContext' cookies='false'> 
    <!-- other settings --> 
</Context> 
+1

這似乎將JSESSIONID附加到應用程序的第一個請求上的URL。但是,如何確保它被附加到後續請求? – 2009-01-13 17:01:31

0

馬特b評論這應該工作的開箱(tomcat會嘗試餅乾,如果失敗回落對編碼會話該URL)。然而,如果你自己創建了一個「普通」鏈接,這將不起作用 - 總是使用像JSTL這樣的方法,所以tomcat可以將跟蹤參數添加到所有URL。

0

最好的辦法是使用URL重寫。所以,當你使用request.getSession(),在container將發送「 在HTTP響應爲Set-Cookie」報頭session-id以及session-id附加到URL(但必須使用response.encodeURL(session_info) URL重寫)。

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    PrintWriter pw=resp.getWriter(); 
    HttpSession session=req.getSession(); 
    pw.println("<html><body>"); 
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>"); 
    pw.println("</body></html>"); 

}