Servlet的線程不安全問題:
造成的根本原因是:Servlet是單例的,Servlet中的非static的成員變量只有一份,多個客戶端好比是多個線程,都訪問的是同一個空間.
解決方案:
1:讓當前Servlet實現javax.servlet.SingleThreadModel接口.
包裝只有一個線程放Servlet,如果有多個線程就排隊,如此的話,性能超低(已過時).
2:在Servlet中不要使用成員變量,使用局部變量.
每一個用戶,每一個請求都會調用service方法,而局部變量在service方法中,每一次都是新的空間.
------------------------------------------------------------------------------------
Struts1,Spring MVC都是線程不安全的,都是單例的和Servlet類似.
Struts2是線程安全的,因為每一個線程(請求)都是一個新的Action對象.
-----------------------------------------------------------------------------------------------------------
Session的操作:
1:創建和獲取Session對象.
HttpSession session = request.getSession(true);如果當前請求中存在一個Session對象,就直接返回,如果不存在Session對象,就先創建一個再返回.
HttpSession session = request.getSession(false);如果當前請求中存在一個Session對象,就直接返回,如果不存在Session對象,就返回null.
HttpSession session = request.getSession();等價於HttpSession session = request.getSession(true);
2:往Session中存儲數據.
session對象.setAttribute(String name,Object value);
3:從Session中取出數據.
Object value = session對象.getAttribute(String key);
4:刪除Session(用戶注銷登陸).
1):刪除Session中指定屬性名的值.
session對象.removeAttrbute("currentName");
2):銷毀Session對象(Session中所有的屬性都不存在).
session對象.invalidate();
5.Session的超時管理
在超時時間之內,如果客戶端和服務端沒有交互(用戶的兩次操作之間不能超過該時間),則自動的銷毀Session.
session對象.setMaxInactiveInterval(60 * 10);//超過10分鍾,銷毀Session.
Tomcat服務器的默認超時時間為:30分鍾,Tomcat一般在20多分鍾就銷毀了.
6.URL重寫.
Session是一種特殊的Cookie,而瀏覽器可以禁用Cookie.
此時,需要在每一個資源之后,手動的攜帶session的ID.
/session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684
String url = response.encodeURL("/session/list");自動的在資源之后拼接;jsessionid=872870F9466CE7B3A11FD3B768FDD684
注意:開發中都不會取消接受Cookie的.
Session的細節:
1:一般的,我們存儲到Session中的屬性名稱,要唯一,我們習慣XXX_IN_SESSION:
session對象.setAttribute("USER_IN_SESSION","will");
2:若需要把多個數據存放到Session中,就得調用setAttribute方法N次,可以的.
一般的,我們把需要存儲的數據,封裝成一個對象,然后在存儲到Session中.
把用戶的信息,封裝到user對象.
session對象.setAttribute("USER_IN_SESSION",user對象);
3:如果多台服務器之間需要共享Session,此時Session中的對象,必須實現java.io.Serializable(才能在網絡上傳輸).
序 列 化: 把對象信息存儲為二進制.
反序列化: 把二進制信息恢復成對象.
public class User implements java.io.Serializable{....}
