HttpSession(****重點****)
1.HttpSession概述
*HttpSession是由JavaWeb提供的,用來會話跟蹤的類。session是服務器端的對象,保存在服務器端!
*HttpSession是Servlet三大域對象之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
*HttpSession底層依賴Cookie,或是URL重寫!
2.HttpSession的作用
*會話范圍:會話范圍是某個用戶從首次訪問服務器開始,到該用戶關閉瀏覽器結束!
>會話:一個用戶對服務器的多次連貫性的請求!所謂連貫性請求,就是該用戶多次請求中間沒有關閉瀏覽器!!!
*服務器會為每個客戶端創建一個session對象,session就好比客戶端在服務器端的賬戶,它們被服務器保存到一個Map中,這個Map被稱之為session緩存!
>Servlet中得到session對象:HttpSession session=request.getSession();
>Jsp中得到session對象:session是jsp的內置對象,不用創建就可以直接使用!
*session域相關方法:
>void setAttribute(String name,Object value);
>Object getAttribute(String name);
>void removeAttribute(String name);
3.案例1:演示session中會話的多次請求中共享數據
*AServlet:向session域中保存數據
*BServlet:從session域中獲取數據
*演示:
>第一個請求:訪問AServlet
>第二個請求:訪問BServlet
AServlet:
1 public class AServlet extends HttpServlet { 2 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 //得到session 6 HttpSession session = request.getSession(); 7 session.setAttribute("name", "金泰妍"); 8 9 } 10 }
BServlet:
1 public class BServlet extends HttpServlet { 2 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 6 //得到session 7 HttpSession session = request.getSession(); 8 String name = (String) session.getAttribute("name"); 9 System.out.println(name); 10 } 11 }
在瀏覽器依次請求http://localhost:8080/XJS_Session/AServlet 和 http://localhost:8080/XJS_Session/BServlet
然后會在控制台打印:
金泰妍
4.案例2:演示保存用戶登錄信息(精通)
*案例相關頁面和Servlet:
>login.jsp:登錄頁面
>succ1.jsp:只有登錄成功才能訪問的頁面
>succ2.jsp:只有登錄成功才能訪問的頁面
>LoginServlet:校驗用戶是否登錄成功!
*各頁面和Servlet內容:
>login.jsp:提供登錄表單,提交表單請求LoginServlet
>LoginServlet:獲取請求參數,校驗用戶是否登錄成功
<>失敗:保存錯誤信息到request域,轉發到login.jsp(login.jsp顯示request域中的錯誤信息)
<>成功:保存用戶信息到session域中,重定向到succ1.jsp頁面,顯示session域中的用戶信息
>succ1.jsp:從session域中獲取用戶信息,如果不存在,顯示“您還沒有登錄”。存在則顯示用戶信息
>succ2.jsp:從session域中獲取用戶信息,如果不存在,顯示“您還沒有登錄”。存在則顯示用戶信息
只要用戶沒有關閉瀏覽器,session就一直存在,那么保存在session中的用戶信息也就一起存在!那么用戶訪問succ1和succ2就會通過!
login.jsp:
1 <body> 2 <h1>登錄</h1> 3 <% 4 String uname=""; 5 //讀名為username的cookie 6 Cookie[] cookies=request.getCookies(); 7 if(cookies!=null){ 8 for(Cookie c:cookies){ 9 //如果為空顯示:"" 10 //如果不為顯示:Cookie值 11 if("username".equals(c.getName())){ 12 uname=c.getValue(); 13 } 14 } 15 } 16 %> 17 18 <% 19 String message="";//一個空字符串 20 String msg=(String)request.getAttribute("msg");//獲取錯誤信息 21 if(msg!=null){ 22 message=msg; 23 } 24 %> 25 <font color="red"><b><%=message %></b></font> 26 <form action="/XJS_Session/LoginServlet" method="post"> 27 用戶名:<input type="text" name="username" value="<%=uname %>"> 28 密 碼:<input type="password" name="password"> 29 <input type="submit" value="提交"> 30 </form> 31 </body>
LoginServlet:
1 public class LoginServlet extends HttpServlet { 2 3 public void doPost(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 request.setCharacterEncoding("utf-8"); 6 String username = request.getParameter("username"); 7 String password = request.getParameter("password"); 8 System.out.println("username:"+username+", password:"+password); 9 if(username!="" && password!=""){ 10 if("xjs".equals(username) && "0309".equals(password)){ 11 //設置Cookie 12 response.setContentType("text/html;charset=utf-8"); 13 Cookie cookie=new Cookie("username",username); 14 cookie.setMaxAge(60*60); 15 response.addCookie(cookie);//把它顯示到用戶名文本框中 16 17 18 //登錄成功 19 HttpSession session=request.getSession(); 20 session.setAttribute("username", username); 21 session.setAttribute("password", password); 22 //重定向到succ1.jsp 23 response.sendRedirect("/XJS_Session/succ1.jsp"); 24 } 25 else{ 26 System.out.println("username:"+username+", password:"+password); 27 //輸入的用戶名和密碼不存在 28 request.setAttribute("msg", "用戶名和密碼不存在!!!"); 29 //用轉發 30 RequestDispatcher rd=request.getRequestDispatcher("/login.jsp"); 31 rd.forward(request, response); 32 } 33 }else{ 34 request.setAttribute("msg", "用戶名或密碼不能為空!!!"); 35 //用轉發 36 RequestDispatcher rd=request.getRequestDispatcher("/login.jsp"); 37 rd.forward(request, response); 38 } 39 } 40 }
succ1.jsp:
1 <body> 2 <% 3 if(session.getAttribute("username")==null&&session.getAttribute("password")==null){ 4 //重定向到login.jsp 5 response.sendRedirect("/XJS_Session/login.jsp"); 6 return;//別的就不執行了 7 } 8 %> 9 <% 10 String username=(String)session.getAttribute("username"); 11 String password=(String)session.getAttribute("password"); 12 out.print("用戶名:"+username); 13 out.print("密碼:"+password); 14 15 %> 16 </body>
succ2.jsp:
1 <body> 2 <% 3 if(session.getAttribute("username")==null&&session.getAttribute("password")==null){ 4 //重定向到login.jsp 5 response.sendRedirect("/XJS_Session/login.jsp"); 6 return;//別的就不執行了 7 } 8 %> 9 <% 10 String username=(String)session.getAttribute("username"); 11 String password=(String)session.getAttribute("password"); 12 out.print("用戶名:"+username); 13 out.print("密碼:"+password); 14 15 %> 16 </body>
1.當用戶在登錄界面輸入xjs和0309,就可以成功登錄!
2.如果直接訪問succ1.jsp的話,會被重定向到login.jsp
3.如果登錄成功的話,會在服務器端保存用戶信息到session域;也會向客戶端保存cookie,下次登錄的時候,用戶名直接填寫在用戶名的輸入框中!
*****注意:用戶名中不能輸入中文,有待完善...
5.HttpSession原理(理解)
*request.getSession()方法:
>獲取Cookie中的JSESSIONID:
<>如果sessionId不存在,創建session,把session保存起來,把新創建的sessionId保存到Cookie中。
<>如果sessionId存在,通過sessionId查找session對象,如果如果沒有查找到,創建session,把session保存起來,把新創建的sessionId保存到Cookie中。
<>如果sessionId存在,通過sessionId查找到了session對象,那么就不會再創建session對象了。
<>返回session。
>如果創建了新的session,瀏覽器會得到一個包含了sessionId的Cookie,這個Cookie的生命為-1,即只在瀏覽器內存中存在,如果不關閉瀏覽器,那么Cookie存在,如果關閉瀏覽器,則該Cookie馬上銷毀。
>下次請求時,再次執行request.getSession()方法時,因為可以通過Cookie中的這個sessionId找到session對象,所以與上一次請求使用的是同一session對象。(在瀏覽器不關閉的情況下再次請求)
*服務器不會馬上給你創建session,在第一次獲取session時,才會創建!request.getSession();
*request.getSession(false)、request.getSession()、request.getSession(),后兩個方法效果相同,
>第一個方法:如果session緩存中(如果Cookie不存在),不存在session,那么返回null,而不會創建session對象。一般不用這個方法,考點!
************注意:
比如只是簡單的訪問Servlet,沒有使用request.getSession()方法,服務器是不會創建session對象的,也沒有sessionId對應的Cookie;(第一次訪問)如果在Servlet中使用了request.getSession()方法或者訪問了jsp頁面,在客戶端瀏覽器中的響應頭中會有一個JSESSIONID的Cookie;(非第一次訪問)會在請求頭中帶上這個JSESSIONID!!
6.HttpSession其他方法:
*String getId():獲取sessionId;
>sessionId的值,就是uuid生成的一個32位16進制的不重復的數;
1 //一個生成32位16進制的字符串的類 2 public class UUIDTest { 3 4 @Test 5 public void fun1(){ 6 //java.util包下的類 7 UUID uuid = UUID.randomUUID(); 8 String str=uuid.toString();//61f65a38-7201-4c62-9925-e8f75a1b41f5 9 str=str.replace("-", "");//把字符串中的-替換成"" 10 System.out.println(str.toUpperCase());//把小寫變大寫 11 } 12 }
*int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),默認為30分鍾,當session對象在30分鍾內沒有使用,那么Tomcat會在session池中移除這個session;
*void invalidate():讓session失效!調用這個方法會讓session失效,當session失效后,客戶端再次請求,服務器會給客戶端創建一個新的session,並在響應中給客戶端新session的sessionId。-----有些網站上有退出按鈕,讓session失效,讓退出后重新登錄!
*boolean isNew():查看session是否為新。當客戶端第一次請求時,服務器為客戶端創建session,但這時服務器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。
>request.getSession().isNew();//可以判斷是在為你創建session還是返回session!
7.web.xml中配置session的最大不活動時間
<session-config> <session-timeout>30</session-timeout> </session-config>
8.URL重寫(理解)
就是把所有頁面中的路徑,都使用response.encodeURL("...');處理一下!
*session依賴Cookie,目的就是讓客戶端發出請求時歸還sessionId,這樣才能找到對應的session
*如果客戶端禁用了Cookie,那么就無法得到sessionId,那么session也就無用了!
*也可以使用URL重寫來替代Cookie
>讓網站的所以超鏈接、表單中都添加一個特殊的請求參數,即sessionId
>這樣服務器可以通過獲取請求參數的到sessionId,從而找到session對象。
*response.encodeURL(String url);
>該方法會對url進行智能的重寫:當請求中沒有歸還sessionId這個cookie,那么該方法會重寫url,否則不重寫!當然url必須是指向本站的url。
============================================================
瀏覽器禁用Cookie的話,才會用到URL攜帶參數JSESSIONID
在頁面中使用:
1 <body> 2 <!-- 手動添加JSESSIONID參數 --> 3 <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">點擊這里</a> 4 <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">點擊這里</a> 5 <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">點擊這里</a> 6 7 <% 8 //它會查看cookie是否存在,如果不存在,在指定的url后添加JSESSIONID參數 9 //如果cookie存在,它就不會在url后添加任何東西! 10 out.print(response.encodeURL("/XJS_Session/AServlet")); 11 %> 12 </body>