您好,登錄后才能下訂單哦!
本篇內容介紹了“JavaWeb核心技術中Session與Cookie怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
會話:用戶打開瀏覽器進行的一系列操作直至關閉瀏覽器的過程看作是一次會話
HTTP協議是無狀態的,不能實現跟蹤對話。比如進入一個網站,每次操作的請求之間相互獨立,無法相互聯系。也就是說你每次請求過后得到的服務器響應或者數據無法被保存。
跟蹤會話的兩種技術:
就服務端來講,采用Session技術。服務器為每一個用戶創建了一個唯一的Session標識用于跟蹤和管理該用戶的資源。用戶在下次提交請求時會一并提交Session標識用于服務器識別然后記錄該用戶的狀態
客戶端,Cookie技術。Cookie也叫做硬盤Cookie,因為Cookie存儲在每一個客戶端的硬盤之上。用戶在第一次訪問服務器時,由服務器通過響應頭的方式將用戶cookie傳遞給瀏覽器。之后的訪問會將請求與cookie一并提交
在理解上:Session可以看作是服務器對于該用戶的標記,而cookie是位于客戶端的標識,客戶提交請求時一并提交cookie,服務器將會根據客戶的cookie找到對應的session標識從而實現跟蹤會話
當用戶關閉瀏覽器后,對應的Cookie標識也會隨即銷毀,但此時服務器端session并未失效,只是由于cookie銷毀后無法繼續跟蹤用戶會話
理解為:用戶的信件 也可以理解為該用戶的標志 由用戶攜帶
用戶向服務器發送的請求當中會包含該cookie
而瀏覽器也會根據該cookie判斷該用戶是否訪問過本網站從而得知該用戶的數據是否已經存在
使用過的cookie會保存在本地的用戶目錄下
// 上面提到過用戶的請求會攜帶cookie 所以要從客戶端獲取到cookie Cookie[] cookies = req.getCookies();// --返回Cookie數組 // 創建cookie 兩個參數 鍵name -- 值value Cookie cookie = new Cookie("LoginTimes",System.currentTimeMillis()+""); // 獲取鍵 cookie.getName() // 獲取值 cookie.getValue() // 設置Cookie有效期 --> 24*60*60表示24小時*60分鐘*60秒 cookie.setMaxAge(24*60*60); // 響應給客戶端一個Cookie(信件) resp.addCookie(cookie);
cookie示例–> 瀏覽器顯示用戶上次的訪問時間
// 參考下方的doGet方法體 { // -- 顯示上次訪問的時間 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("contenttype","text/html;charset=UTF-8"); System.out.println("resp編碼:"+resp.getCharacterEncoding()); System.out.println("req編碼:"+req.getCharacterEncoding()); PrintWriter out = resp.getWriter(); // 從客戶端獲取Cookie Cookie[] cookies = req.getCookies();// --返回Cookie數組 // 判斷該用戶是否已經存在Cookie if (cookies!=null){ out.write("LastTime Login Time:"); for (Cookie cookie : cookies) { // 遍歷找到訪問時間的Cookie getName獲得cookie中的鍵 if (cookie.getName().equals("LoginTimes")){ // 獲取LoginTimes-Cookie的值 -- value long l = Long.parseLong(cookie.getValue()); Date date = new Date(l); out.write(date.toLocaleString()); } } } // 記錄本次訪問的時間 --> 新建Cookie Cookie cookie = new Cookie("LoginTimes",System.currentTimeMillis()+""); // 設置Cookie有效期 --> 24*60*60表示24小時*60分鐘*60秒 cookie.setMaxAge(24*60*60); // 響應給客戶端一個Cookie(信件) resp.addCookie(cookie); }
如下代碼所示
// setCharacterEncoding意思是在程序中將請求和響應均置為utf-8編碼 但是可能瀏覽器會無法解析 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); // 瀏覽器使用的編碼集可能與UTF-8不同 所以此處設置瀏覽器采用UTF-8編碼 resp.setHeader("content-type","text/html;charset=UTF-8");
但是我們在想要使cookie的值為中文漢字時,建議使用URLEncoder/URLDncoder
// 編碼 URLEncoder.encode("張三","utf-8"); // 解碼 URLDecoder.decode("李四","utf-8");
/*源碼解析:以秒為單位指定cookie的最大期限;如果否定,則表示未存儲cookie;如果為零,則刪除cookie */ resp.setMaxAge(0);
首先打開瀏覽器頁面審查元素 選中網絡
在地址欄中執行對應操作
然后在審查元素->網絡中會看到我們的請求數據包
點擊該數據包即可查看所有信息
以上述顯示登錄時間為例 可以看到此處的Cookie 有一個LoginTime對應的值
還可以點擊應用選中cookie即可查看所有的cookie屬性
一個Session獨占一個瀏覽器,一個瀏覽器對應一個Session(同一用戶在不同瀏覽器登錄,使用的session是不同的),瀏覽器未關閉Session就一直存在
用戶登錄網站成功之后會分到一個SessionID,至此,用戶在該網站執行何種操作都無需再次登錄,因為在提交請求時服務器會識別用戶session然后在此session之下響應用戶請求
Session存放在服務器,用戶實際拿到的是SessionID
// Session對象 HttpSession session = req.getSession(); // session創建時間 out.write("創建時間:"+session.getCreationTime()+"\n"); // sessionID獲取 out.write("SessionID:"+session.getId()+"\n"); // session上次訪問時間 out.write("上次訪問時間:"+session.getLastAccessedTime()+"\n"); // setAttribute設置鍵值屬性 getAttribute根據鍵獲取值 // getValue 根據鍵獲取值-->從2.2開始唄getA他tribute替代 // removeAttribute(String name) 刪除name鍵綁定的對象 如果不存在則不執行任何操作 // isNew() 判斷該Session是否為新創建的 //注銷Session session.invalidate(); //注銷Session也會注銷掉SessionID
Session使用->servlet交互數據
Session不僅可以傳輸String類型還可以傳輸對象
// Servlet 1 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 編碼問題 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("content-type","text/html;charset:utf-8"); // 流 PrintWriter out = resp.getWriter(); // Session // -- 1.獲取Session對象 HttpSession session = req.getSession(); // -- 2.獲取SessionID String id = session.getId(); // -- 3.判斷該ID是否存在 if (session.isNew()) { out.write("SessionID已存在:"+id); }else { out.write("Session創建成功,ID:"+id); } out.write("<h2>數據已寫出,跳轉checkData查看</h2>"); // -- 4.寫出數據 session.setAttribute("name","張三"); } // Servlet 2 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 編碼 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("content-type","text/html;charset=UTF-8"); // 獲取數據 HttpSession session = req.getSession(); String name = (String) session.getAttribute("name"); // 寫出數據 resp.getWriter().write("name:"+name); }
傳輸對象時只需將session.setAttribute("鍵", 值)
中的值更改為對象即可
通過抓包發現,在用戶第一次請求時會由服務器創建Session并存儲為cookie的形式(JSESSIONID=你的SessionID),那么當用戶提交請求時(我們已經知道Cookie會被一起提交),所以此時服務器也會獲取到你的Session,因此你的請求操作都將會在同一Session中執行。等同于服務器識別到了你的Session你就擁有了某種權限
Session保存在服務器端,當用戶量過多時就可能會出現服務器過載現象。所以開發時也需要提前避免,所以通常利用Session+Cookie使用來減輕服務器壓力。重要信息保存在Session中,其他信息可以用Cookie保存
Cookie單個能保存的最大數據量為4kb,通常一個瀏覽器站點只允許存在20個cookie是把用戶數據寫到用戶瀏覽器,瀏覽器保存
Session是把用戶數據寫到用戶的獨占Session中
Session相對于cookie使用頻率更高,更加方便。cookie只能用于存儲字符串(以鍵值對的形式)并且可存放數據有限,而Session可以存儲對象
“JavaWeb核心技術中Session與Cookie怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。