我正在一個webprojekt工作,我爲了最大限度地減少會話膨脹,主要使用ViewScoped bean。但後來我面臨的問題是我需要在我的bean之間傳輸客戶端用戶名和密碼(以訪問數據庫等)。如何在ViewScoped bean之間傳輸祕密用戶名和密碼?
我已經在那裏我使用Flash對象傳遞豆之間的用戶名和密碼,如這樣的系統:
public String gotoNextView() {
ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
external.getFlash().put("user_name", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("user_name"));
external.getFlash().put("password", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("password"));
return "/../../next_view.xhtml";
}
但我擔心這是否是某種可能被黑客操縱客戶端從而欺騙服務器以暴露Flash對象!
我正在考慮的另一個解決方案是將Web應用程序的所有JSESSIONID作爲鍵存儲在Map中,並將用戶名和密碼作爲值存儲。爲了做到這一點,我想我需要在用戶會話結束或過期時調用回調方法,以便我可以從Map中刪除相關的JSESSIONID。但是這個解決方案的問題是我不確定實現回調的最佳方式是什麼,這樣我就可以100%確定在服務器創建一個新的類似的JSESSIONID之前Map條目被移除了(儘管我知道在這麼短的時間內發生的機會非常小)。另外,我對使用JSESSIONID(用戶)的bean有什麼疑問,如果由於某種原因,服務器在bean(例如數據庫操作)完成之前丟棄了JSESSIONID(因爲我可能會冒一個新的類似的JSESSIONID是由服務器爲另一個用戶創建的,然後可能會與JSESSIONID混合並且其他bean正在服務用戶)。
我希望對問題有深入瞭解的人會寫出什麼是最佳實踐和100%安全的方法(同樣,我想大多數使用JSF webapp服務器的人都會遇到此問題,因此它會是有助於他人瞭解問題的最佳解決方案)。謝謝。
你不應該存儲密碼***之前的任何地方加密你的東西(考慮開銷),***甚至沒有在會議或請求範圍內。應用程序應該自己訪問數據庫,而不是用戶。 – EJP 2014-09-04 10:36:59
是否有一個原因,你不想使用會話屬性的用戶名?在會議中只保留這些信息會使會議保持較小的狀態,並避免所有問題。 – 2014-09-04 10:39:09
@Martin Frey:你在談論使用HttpServletRequest和HttpServletResposne對象嗎?我只是不知道該怎麼做! – 2014-09-04 13:00:52