【Servlet】Servlet的線程不安全問題/Session


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{....}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM