HttpSession


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>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM