Java Web三大作用域對象:
- HttpServletRequest
- HttpSession
- ServletContext
1.Session與Cookie
1.1 Session
A session is a group of user interactions with your website that take place within a given time frame.
會話是在給定時間范圍內發(fā)生的一組用戶與網(wǎng)站的互動。
在WEB開發(fā)中,服務器可以為每個用戶瀏覽器創(chuàng)建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認情況下)。因此,在需要保存用戶數(shù)據(jù)時,服務器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務。
Session的數(shù)據(jù)存儲在Tomcat服務器的內存中,具有時效性。
1.2 Cookie
cookie 是一個非常具體的東西,指的就是瀏覽器里面能永久存儲的一種數(shù)據(jù),僅僅是瀏覽器實現(xiàn)的一種數(shù)據(jù)存儲功能。
服務器生成cookie,發(fā)送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網(wǎng)站時會把該cookie發(fā)送給服務器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據(jù)太多磁盤空間,所以每個域的cookie數(shù)量是有限的。
有了Cookie這樣的技術實現(xiàn),服務器在接收到來自客戶端瀏覽器的請求之后,就能夠通過分析存放于請求頭的Cookie得到客戶端特有的信息,從而動態(tài)生成與該客戶端相對應的內容。
Cookie的方法
| javax.servlet.http.Cookie; | 描述 |
|---|---|
| public void setDomain(String pattern) | 設置 cookie 的域名,比如 loserwang.com |
| public String getDomain() | 獲取 cookie 的域名,比如loserwamg.com |
| public void setMaxAge(int expiry) | 設置 cookie 有效期,以秒為單位,默認有效期為當前session的存活時間 |
| public int getMaxAge() | 獲取 cookie 有效期,以秒為單位,默認為-1 ,表明cookie會活到瀏覽器關閉為止 |
| public String getName() | 返回 cookie 的名稱,名稱創(chuàng)建后將不能被修改 |
| public void setValue(String newValue) | 設置 cookie 的值 |
| public String getValue() | 獲取cookie的值 |
| public void setPath(String uri) | 設置 cookie 的路徑,默認為當前頁面目錄下的所有 URL,還有此目錄下的所有子目錄 |
| public String getPath() | 獲取 cookie 的路徑 |
| public void setSecure(boolean flag) | 指明 cookie 是否要加密傳輸 |
| public void setComment(String purpose) | 設置注釋描述 cookie 的目的。當瀏覽器將 cookie 展現(xiàn)給用戶時,注釋將會變得非常有用 |
| public String getComment() | 返回描述 cookie 目的的注釋,若沒有則返回 null |
實現(xiàn)Cookie
//(1) 創(chuàng)建一個 Cookie 對象
Cookie cookie = new Cookie("key","value");
//(2) 設置最大生存周期
cookie.setMaxAge(60*60*24);
//(3) 發(fā)送 Cookie 到 HTTP 響應頭
response.addCookie(cookie);
中文編碼
Servlet Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文","UTF-8"); //編碼
String str = java.net.URLDecoder.decode("編碼后的字符串","UTF-8"); // 解碼
1.3 Session跟蹤
Web應用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無狀態(tài)的協(xié)議。一旦數(shù)據(jù)交換完畢,客戶端與服務器端的連接就會關閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務器無法從連接上跟蹤會話。即用戶A購買了一件商品放入購物車內,當再次購買商品時服務器已經(jīng)無法判斷該購買行為是屬于用戶A的會話還是用戶B的會話了。
每一個Session都有其Sessiond,瀏覽器和服務器之間通過SessionID進行跟蹤會話,有以下三種方式來維持 Web 客戶端和 Web 服務器之間的 session 會話
- Cookie : 一個 Web 服務器可以分配一個唯一的 session 會話 ID 作為每個 Web 客戶端的 cookie,對于客戶端的后續(xù)請求可以使用接收到的 cookie 來識別。這可能不是一個有效的方法,因為很多瀏覽器不支持 cookie,所以我們建議不要使用這種方式來維持 session 會話。
- URL 重寫 : 您可以在每個 URL 末尾追加一些額外的數(shù)據(jù)來標識 session 會話,服務器會把該 session 會話標識符與已存儲的有關 session 會話的數(shù)據(jù)相關聯(lián)。例如,http://w3cschool.cc/file.htm;sessionid=12345。
- 隱藏的表單字段 : 一個 Web 服務器可以發(fā)送一個隱藏的 HTML 表單字段,以及一個唯一的 session 會話 ID,如下所示:
<input type="hidden" name="sessionid" value="12345">
1.4 HttpSession 對象
| javax.servlet.http.HttpSession ; | 描述 |
|---|---|
| public Object getAttribute(String name) | 該方法返回在該 session 會話中具有指定名稱的對象,如果沒有指定名稱的對象,則返回 null。 |
| public Enumeration getAttributeNames() | 該方法返回 String 對象的枚舉,String 對象包含所有綁定到該 session 會話的對象的名稱。 |
| public long getCreationTime() | 該方法返回該 session 會話被創(chuàng)建的時間,自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。 |
| public String getId() | 該方法返回一個包含分配給該 session 會話的唯一標識符的字符串。 |
| public long getLastAccessedTime() | 該方法返回客戶端最后一次發(fā)送與該 session 會話相關的請求的時間自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。 |
| public int getMaxInactiveInterval() | 該方法返回 Servlet 容器在客戶端訪問時保持 session 會話打開的最大時間間隔,以秒為單位。 |
| public void invalidate() | 該方法指示該 session 會話無效,并解除綁定到它上面的任何對象。 |
| public boolean isNew() | 如果客戶端還不知道該 session 會話,或者如果客戶選擇不參入該 session 會話,則該方法返回 true。 |
| public void removeAttribute(String name) | 該方法將從該 session 會話移除指定名稱的對象。 |
| public void setAttribute(String name, Object value) | 該方法使用指定的名稱綁定一個對象到該 session 會話。 |
| public void setMaxInactiveInterval(int interval) | 該方法在 Servlet 容器指示該 session 會話無效之前,指定客戶端請求之間的時間,以秒為單位。 |
HttpSessiony原理:
Tomcat服務器會自動為每一個瀏覽器請求創(chuàng)建一個有SessionId的Session,然后每次以Cookie的形式將SeesionId返回瀏覽器,瀏覽器下次訪問就攜帶這個Cookie:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受請求發(fā)來的參數(shù)
String name = req.getParameter("name");
String password = req.getParameter("password");
HttpSession session = req.getSession();
session.setAttribute("name", name);
session.setAttribute("password", password);
resp.getWriter().println("<p>name : " + name + "</p>" );
resp.getWriter().println("<p>password : " + password + "</p>" );
System.out.println(session.getId());
}
當訪問相應網(wǎng)頁后,結果如下:

