1、會話技術
(1)從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。
注:瀏覽器沒關,只關閉一個網頁不算會話結束;
(2)分類:cookie和session
2、cookie:客戶端本地;客戶端可以清除cookie;安全性不好;減輕服務器存儲壓力;
(1)服務器向客戶端發送一個cookie:響應頭set-cookie
1)創建cookie;Cookie cookie = new Cookie(String Name,String Value);
鍵值對;set-cookie響應頭;別寫中文;
2)設置持久化時間:cookie.setMaxAge(60*10)里面的單位是秒;
不設置存儲在瀏覽器內存中,關閉后銷毀,設置后持久化到瀏覽器的磁盤文件;超過時間自動銷毀;
3)設置攜帶路徑:cookie.setPath(String path);
注:("/")任何路徑都可以;("/web05")web05下的所有路徑都可以;
不設置cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息;
舉例:cookie信息在web05的sendcookie里,那么訪問完sendcookie后,訪問web05下的其他項目也會有此cookie信息;
4)發送cookie:response.addCookie(Cookie cookie);
package com.oracle.cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class cookieServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //1、創建cookie對象 Cookie cookie = new Cookie("goods","xsphone"); //設置cookie持久化時間----------在硬盤上保存的時間 cookie.setMaxAge(60); //為cookie設置攜帶路徑 //cookie.setPath("/Day20/cookieServlet"); //cookie.setPath("/Day20"); //2、存儲數據發送到客戶端 response.addCookie(cookie); response.getWriter().write("hello world!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
效果如下:
5)刪除cookie:使用同名同路徑的持久化時間為0的cookie進行覆蓋;必須是同名同路徑;
package com.oracle.cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class removecookieServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //創建一個cookie Cookie cookie = new Cookie("goods","xsphone"); cookie.setPath("/Day20"); cookie.setMaxAge(0); response.addCookie(cookie); response.getWriter().write("hello world!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
重新設置時間操作顯示如下:
(2)服務器接收客戶端cookie:請求頭cookie
1)獲取所有的cookie:Cookie[] cookies = request.getCookies();
2)遍歷Cookie數組:
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){String cookieValue = cookie.getValue();}}
注意先訪問cookieServlet!
package com.oracle.cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class getcookieServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //先獲取裝有cookie對象的數組 Cookie[] cookie = request.getCookies(); for(Cookie c:cookie){ if(c.getName().equals("goods")){ System.out.println(c.getValue()); } } response.getWriter().write("hello world!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
效果如下:
控制台打印輸出:
3、session:服務器;安全性好;加重服務器存儲壓力;
(1)獲得Session對象:HttpSession session = request.getSession();
!!!在一個瀏覽器中sessionid是同一個;根據sessionid判斷是否存在;
(2)設置session持久化時間:Cookie cookie = new Cookie("JSESSIONID",request.getSession().getId());cookie.setMaxAge(60*10);
本質是設置cookie;
(3)session也是一個域對象;三個方法;
package com.oracle.seesion; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class session extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); HttpSession session = request.getSession(); String id = session.getId(); session.setAttribute("goods", "shouji"); //設置JSESSIONID的持久化時間 Cookie cookie = new Cookie("JSESSIONID",id); cookie.setPath("/Day20"); cookie.setMaxAge(60*2); response.addCookie(cookie); response.getWriter().write(id); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
效果如下:
在不關閉瀏覽器的情況下,訪問第二個servlet:
package com.oracle.seesion; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class seesion extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); HttpSession session = request.getSession(); String id = session.getId(); HttpSession session1 = request.getSession(); String id1 = session1.getId(); String name = (String)session.getAttribute("goods"); response.getWriter().write(id+".."+id1); response.getWriter().write(name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
效果如下:
!!!可以看出ID都是一樣的;
(4)session生命周期:第一次執行request.getSession()時創建;服務器(非正常)關閉時或者session過期/失效(默認30分鍾)銷毀;
(5)設置session銷毀時間:從不操作服務器端的資源開始計時默認30分鍾;session.invalidate();web.xml配置;