javaWEB與Session


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

 

public class Aservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
           //得到session對像
            HttpSession session=request.getSession();
            //設置session的值
            session.setAttribute("AAA", "aaa");
            //請求包含
            request.getRequestDispatcher("/Bservlet").forward(request, response);
    }

}

Bservlet

public class Bservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //得到session對像
        HttpSession session=request.getSession();
        //d得到session的值
        String  a=(String)session.getAttribute("AAA");
        //輸出值
        response.getOutputStream().print(a);
    }
}

 


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就會通過!
  主要代碼:

  LoginServlet:

public class loginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
          //獲取驗證碼判斷是否正確。錯誤情況下吧錯誤信息保存到request
           String vc=(String)request.getSession().getAttribute("vc");
           //獲取表單信息
           String code=request.getParameter("code");
           if(vc.equals(code)){
          //獲取表單信息
           String  user=request.getParameter("user");
           String  password=request.getParameter("password");
           if(user!=null||password!=null){
           //判斷用戶密碼是否正確,如果爭取數據儲存到session,失敗錯誤信息儲存到reques中
           if(user.equals("123")&& password.equals("123456")){
               //設置cookes
               Cookie cookes=new Cookie("user", user);
               cookes.setMaxAge(60*60*24);
               response.addCookie(cookes);
              HttpSession session=request.getSession();
              //保存
              session.setAttribute("user", user);
              session.setAttribute("password", password);
              response.sendRedirect("session/succ1.jsp");//session/succ1.jsp
              
           }else{
               request.setAttribute("error", "用戶名或者密碼錯誤");
               request.getRequestDispatcher("/session/login.jsp").forward(request, response);
           }
           
           }else{
               System.out.println("post獲取值失敗");
           }
     }else{
         request.setAttribute("msg", "驗證碼錯誤");
         request.getRequestDispatcher("/session/login.jsp").forward(request, response);
     }
    }
}

login.jsp

 

<script type="text/javascript">
function _change() {
    /*
    1. 得到img元素
    2. 修改其src為/day11_3/VerifyCodeServlet
    */
    var imgEle = document.getElementById("img");
    imgEle.src = "/day11_2/VerfiyServlet?a=" + new Date().getTime();
}
</script>
  
  <body>
  <%//讀取cookie
  String user="";
  Cookie[] cookie=request.getCookies();
    if(cookie!=null){
        for(Cookie a:cookie){
            if(a.getName().equals("user")){
                user=a.getValue();
            }
        }
    }
    
  %>
    <%
    String a="";
    String  error1=(String)request.getAttribute("error");
    if(error1!=null){
        a=error1;
    }
    %>
     } 
     %>
 
    <form action="/day11_2/loginServlet" method="post"><br>
     用戶名:<input type="text" name="user" value="<%=user%>">
     <font color="red"><b><%=a %> </b></font>
     密   碼:<input type="password" name="password"> <br>
     <font color="red"><b><%=b %> </b></font>
        <input type="submit" value="登錄">
        <input type="text" name="code">
        <img  id="img" src="/day11_2/VerfiyServlet">
       <%
    String message = "";
    String msg = (String)request.getAttribute("msg");//獲取request域中的名為msg的屬性
    if(msg!= null) {
        message = msg;
    }
%>
       <font color="red"><b><%=message %> </b></font>
       <a href="javascript:_change()">換一張</a>
    </form>

 

 

 

succ1.jsp

 <%
       String user=(String)session.getAttribute("user");
       String password=(String)session.getAttribute("password");
       if(user.equals("123") || password.equals("123456")){
           out.print("用戶戶名:"+user+"------"+"密碼:"+password);
       }else{
           request.setAttribute("session", "登錄頁面錯誤");
           request.getRequestDispatcher("/session/login.jsp").forward(request, response);
       }
   %>

 

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就一直存在。
    > 下次請求時,再次執行request.getSession()方法時,因為可以通過Cookie中的sessionId找到session對象,所以與上一次請求使用的是同一session對象。
 
  * 服務器不會馬上給你創建session,在第一次獲取session時,才會創建!request.getSession();

  * request.getSession(false)、request.getSession(true)、request.getSession()后兩個方法效果相同
    > 第一個方法:如果session緩存中(如果cookie不存在),不存在session,那么返回null,而不會創建session對象。

6. HttpSession其他方法:
  * String getId():獲取sessionId;
  * int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),默認為30分鍾。當session在30分鍾內沒有使用,那么Tomcat會在session池中移除這個session;
  * void invalidate():讓session失效!調用這個方法會被session失效,當session失效后,客戶端再次請求,服務器會給客戶端創建一個新的session,並在響應中給客戶端新session的sessionId;
  * boolean isNew():查看session是否為新。當客戶端第一次請求時,服務器為客戶端創建session,但這時服務器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時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轉換成response的參數


免責聲明!

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



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