會話
現實生活中我們會用手機跟對方對話,拿起手機,撥號,然后對面接聽,跟着互相通話,最后會話結束。
這個過程也可以用我們的B/S模式來描述:
打開瀏覽器—>輸入地址->發出請求->服務器收到請求->向瀏覽器發出響應->..重復.->關閉瀏覽器
這樣的過程我們用 “會話” 來描述,上面就一次會話的例子。
會話管理
知道會話的概念后,我們在平時上網是否可以看到一些網頁有這樣的操作:當你是第一次登入這個網站,網站會發出:”歡迎來到本網站”。 然而,當你第二次登入該網站,它就會發出:”歡迎再次回來”。 為什么服務器會知道我們已經登入過該頁面呢?無錯,就是在與服務器會話的過程中產生了一些數據,而這些數據被保存下來,服務器根據這些數據來判斷你是否登陸過該頁面,而輸出不同歡迎標語。
下面就來學習兩門會話信息管理技術:
Cookie技術: 會話數據保存在瀏覽器客戶端。
Session技術:會話數據保存在服務器端。
Cookie技術
什么是Cookie技術:
一種會話數據管理技術,該技術把會話數據保存在瀏覽器客戶端。
那么Cookie技術的原理是什么,它是如何工作的呢?
1)首先瀏覽器向服務器發出請求。
2)服務器就會根據需要生成一個Cookie對象,並且把數據保存在該對象內。
3)然后把該Cookie對象放在響應頭,一並發送回瀏覽器。
4)瀏覽器接收服務器響應后,提出該Cookie保存在瀏覽器端。
5)當下一次瀏覽器再次訪問那個服務器,就會把這個Cookie放在請求頭內一並發給服務器。
6)服務器從請求頭提取出該Cookie,判別里面的數據,然后作出相應的動作。
Cookie的體驗
知道了Cookie的原理后,我們就用它來實現一些功能吧~
從它的原理中,我們知道Cookie是在服務器端創建的,那么我們在Servlet中創建一個Cookie對象吧:
public class cookieTest extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("name", "value"); } }
Cookie的構造方法接收兩個參數,第一個參數是該要傳遞的數據的名字,第二個是該數據的值。
然后我們把這個Cookie加到響應頭,發送給瀏覽器吧~
Cookie cookie = new Cookie("name", "value"); response.addCookie(cookie);
這樣一個Cookie就發送給瀏覽器了,我們在瀏覽器看看發過來的響應頭:
有一個Set-Cookie的請求頭,它保存了我們設置的信息。
然后我們用瀏覽器再次訪問該Servlet,看看它的請求頭:
可以看到,瀏覽器會把這個Cookie信息發過去服務器。
那么服務器收到這個請求后,如何得到該Cookie里的數據呢?
我們可以這樣做:
Cookie cookie = new Cookie("name", "value"); response.addCookie(cookie); Cookie[] cookies = request.getCookies(); if(cookies!=null){ for(Cookie c: cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+"="+value); } }else{ System.out.println("沒有cookie信息"); }
調用request.getCookies()方法,返回一個Cookie數組,然后遍歷它把里面的內容取出來吧!
Cookie常用方法
1)創建Cookie對象
Cookie(java.lang.String name, java.lang.String value)
2)設置Cookie對象
setPath(java.lang.String uri) --設置cookie的有效路徑,就是指定該Cookie訪問哪個資源時會傳過去,訪問其他資源則就不會傳。
setMaxAge(int expiry) --設置cookie的有效時長,以秒為單位
setValue(java.lang.String newValue) --設置cookie的值
3)發送cookie信息到瀏覽器
response. addCookie(Cookie cookie)
4)接收瀏覽器發送的cookie信息
Cookie[] getCookies()
Cookie細節
1)設置cookie的有效路徑: setPath(路徑) 。把cookie設置到某個路徑下,那么瀏覽器在該路徑下訪問服務器時就會帶着cookie信息到服務器;否則,就不會帶着Cooke信息到服務器。
2)設置cookie的有效時長: setMaxAge(整數)。
正整數: 表示cookie數據保存在瀏覽器的緩存區中(硬盤中),以秒為單位。例如,10: cookie在10秒之后失效!
負整數: 表示cookie數據保存在瀏覽器的內存區中。關閉瀏覽器cookie就會失效!
零: 表示刪除同名的cookie數據
3)設置cookie的值: setValue(值)
4)cookie保存的會話數據類型必須是字符串的。瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
5)cookie不適合保存敏感數據(例如密碼)
Session技術
什么是Session技術:
一種會話數據管理技術,該技術把會話數據保存在服務器端。
同樣都是會話數據管理技術,為什么我們要發明Session技術呢?
我們先分析一下Cookie的局限性:
1)Cookie數據類型都是String,且容量有限制的。
2)Cookie不適合保存敏感數據
所以,Session技術可以解決這兩種情況。
那么Session技術的原理是什么,它是如何工作的呢?
1)瀏覽器發出請求到服務器。
2)服務器會根據需求生成Session對象,並且給這個Session對象一個編號,一個編號對應一個Session對象
3)服務器把需要記錄的數據封裝到這個Session對象里,然后把這個Session對象保存下來。
4)服務器把這個Session對象的編號放到一個Cookie里,隨着響應發送給瀏覽器
5)瀏覽器接收到這個cookie就會保存下來
6)當下一次瀏覽器再次請求該服務器服務,就會發送該Cookie
7)服務器得到這個Cookie,取出它的內容,它的內容就是一個Session的編號!!!
8)憑借這個Session編號找到對應的Session對象,然后利用該Session對象把保存的數據取出來!
Session的體驗
下一面我們就在Servlet內創建一個Session吧:
public class sessionTest extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("name", "Rime"); } }
這樣當瀏覽器請求這個Servlet服務時,就會把這個session發過去啦~,我們來看看服務器收到的響應頭吧!
可以看到服務器給瀏覽器發出了一個 Set-Cookie 的響應頭,里面有一個JSESSIONID!沒錯,這個就是Session的編號了!
然后我們再次訪問這個Servlet吧!
瀏覽器會把保存這個JSESSIONID的cookie發送過去服務器~那么服務器接收這個session編號,然后取出這個編號對應的數據吧!!
//得到數據 String name = (String)session.getAttribute("name"); System.out.println("name="+name);
然后看到輸出結果:
name=Rime
這樣就服務器就可以根據這個name的值來根據需要做出一些動作了~
Session的API
學習HttpSession
1)創建/得到HttpSession對象
HttpSession request.getSession()
HttpSession request.getSession(boolean create)
2)HttpSession作為域對象保存會話數據
void setAttribute(java.lang.String name, java.lang.Object value) 保存數據
java.lang.Object getAttribute(java.lang.String name) 得到數據
void removeAttribute(java.lang.String name) 清除數據
3)session細節:
java.lang.String getId() 得到session對象的編號
void setMaxInactiveInterval(int interval) 設置session對象的有效時長
void invalidate() 銷毀session對象
Session細節
1)得到session編號: getId()
2)session對象生命周期:
2.1 session對象什么創建?
執行request.getSession()方法時
2.2 session對象什么銷毀?
1)默認情況下,session對象在30分鍾之后服務器自動銷毀。
2)手動設置session有效時長
void setMaxInactiveInterval(int interval) -以秒為單位。
3)配置session的有效時長(統一配置)
4)手動銷毀
void invalidate()
3)getSession方法的使用
getSession(true) / getSession() : 創建或得到session對象。如果得不到session對象,創建 新的session對象。主要是用於創建session對象的。
getSession(false) :得到session對象。如果得不到session對象,返回null。主要用於判斷是否可以得到session對象的。
4)session編號的cookie過期時間:
默認情況下,cookie是在瀏覽器關閉時失效!!!
修改cookie的有效時長:
setMaxAge(正整數);