是否可以通過Servlet API爲HTTP會話分配自定義ID?Java Servlet API會話處理中的自定義ID API
我知道從任何應用程序服務器(例如Tomcat)處理會話,生成唯一標識就足夠了。但是我根據每個用戶和時間的信息自定義唯一的會話ID,因此不會重複。
然後我查看了有關會話處理的每個文檔,但是無處找到我需要的。
這是一個項目的要求,所以如果不可能,我需要知道原因(或者它只是通過API不可用)。
是否可以通過Servlet API爲HTTP會話分配自定義ID?Java Servlet API會話處理中的自定義ID API
我知道從任何應用程序服務器(例如Tomcat)處理會話,生成唯一標識就足夠了。但是我根據每個用戶和時間的信息自定義唯一的會話ID,因此不會重複。
然後我查看了有關會話處理的每個文檔,但是無處找到我需要的。
這是一個項目的要求,所以如果不可能,我需要知道原因(或者它只是通過API不可用)。
如果您使用的是Tomcat,則可以創建自定義會話管理器(請參閱this discussion)。然後,您可以訪問Tomcat Session對象,並可以調用setId。
呃......如果你有代碼來生成一個唯一的ID,你可以這樣做:
/**
* The String key of the user id attribute.
*/
public static final String USER_ID_KEY = "userIdKey";
// Set the user attribute (createUniqueUserId's parameters and return type are up to you)
httpSession.setAttribute(USER_ID_KEY, createUniqueUserId());
// Retrieve the user attribute later
httpSession.getAttribute(USER_ID_KEY);
HttpSession接口還提供了getId()方法,這是記錄here(複製爲參考文獻):
公共java.lang.String中的getId()
返回包含分配給該會話的唯一標識符 一個字符串。 該標識符由 servlet容器分配,並且是依賴於實現的 。
返回: 字符串,指定分配給本次會議
該servlet API不支持創建自己的cookie值標識 。實際上,它不能保證會話通過cookie來維護......它明確指出可以通過諸如「URL重寫」之類的機制來維護會話。它確保會話以某種方式進行維護,並且幾乎需要某種傳遞給瀏覽器並返回的唯一ID,但Servlet API中沒有提供用於控制使用什麼值的Servlet代碼的機制。我所知道的通用servlet容器(例如Tomcat)也不提供控制此值的方法。
但是,如果我正確理解您的要求,這些都不應該成爲您的問題。僅僅因爲Tomcat(或者你使用的任何servlet容器)正在基於它自己的算法(包含密碼安全的隨機數生成器等來防止會話ID的「猜測」)創建一個唯一的ID,並不意味着你不能創建一個SEPARATE ID符合您的要求(基於用戶和時間,在所有會議中獨一無二......無論您需要什麼)。這個ID可以存儲在會話中(如果這是你需要的),或者可以存儲在瀏覽器中的一個單獨的cookie(如果你需要它在會話中維護)。唯一的影響是瀏覽器存儲了兩個cookie - 而大多數網站存儲的cookie比這個多!