<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      ?

      ?

      十二、JSP表單處理

      我們?cè)跒g覽網(wǎng)頁(yè)的時(shí)候,經(jīng)常需要向服務(wù)器提交信息,并讓后臺(tái)程序處理。瀏覽器中使用 GET 和 POST 方法向服務(wù)器提交數(shù)據(jù)。

      GET 方法

      GET方法將請(qǐng)求的編碼信息添加在網(wǎng)址后面,網(wǎng)址與編碼信息通過(guò)"?"號(hào)分隔。如下所示:
      http://www.runoob.com/hello?key1=value1&key2=value2
      GET方法是瀏覽器默認(rèn)傳遞參數(shù)的方法,一些敏感信息,如密碼等建議不使用GET方法。

      用get時(shí),傳輸數(shù)據(jù)的大小有限制 (注意不是參數(shù)的個(gè)數(shù)有限制),最大為1024字節(jié)。

      POST 方法

      一些敏感信息,如密碼等我們可以通過(guò)POST方法傳遞,POST提交數(shù)據(jù)是隱式的。

      POST提交數(shù)據(jù)是不可見(jiàn)的,GET是通過(guò)在url里面?zhèn)鬟f的(可以看一下你瀏覽器的地址欄)。

      JSP使用getParameter()來(lái)獲得傳遞的參數(shù),getInputStream()方法用來(lái)處理客戶端的二進(jìn)制數(shù)據(jù)流的請(qǐng)求。

      JSP 讀取表單數(shù)據(jù)

      * getParameter():?使用 request.getParameter() 方法來(lái)獲取表單參數(shù)的值。
      * getParameterValues():?獲得如checkbox類(lèi)(名字相同,但值有多個(gè))的數(shù)據(jù)。 接收數(shù)組變量 ,如checkbox類(lèi)型
      * getParameterNames():該方法可以取得所有變量的名稱,該方法返回一個(gè) Enumeration。
      * getInputStream():調(diào)用此方法來(lái)讀取來(lái)自客戶端的二進(jìn)制數(shù)據(jù)流。
      ?
      <%@ page contentType="text/html;charset=UTF-8" language="java"
      pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>表單信息</title>
      </head> <body> <form action="Demo1.jsp" method="post"> <input type="text"
      name="name"/><br> <input type="text" name="url"/><br> <input type="checkbox"
      name="mao" checked="checked"/>貓<br> <input type="checkbox" name="gou"/>狗<br>
      <input type="checkbox" name="ji" checked="checked"/>雞<br> <input
      type="checkbox" name="ya"/>鴨<br> <input type="submit" value="提交"> </form>
      </body> </html>
        
      <%@ page import="java.util.Enumeration" %> <%@ page
      contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSP</title> </head>
      <body> <h1>讀取參數(shù)信息</h1> <table align="center" border="1" width="100%"> <tr
      bgcolor="#f0f8ff"> <th>參數(shù)名</th> <th>對(duì)應(yīng)值</th> </tr> <% Enumeration<String>
      parameterNames = request.getParameterNames();
      request.setCharacterEncoding("utf-8"); while
      (parameterNames.hasMoreElements()){ String name = parameterNames.nextElement();
      out.println("<tr><td>"+name+"</td>\n"); String url =
      request.getParameter(name); out.println("<td>"+url+"</td></tr>\n"); } %>
      </table> <% %> </body> </html>
        



      ?

      十三、四大域?qū)ο螅簩?shí)際開(kāi)發(fā)如何用?

          PageContext:pageConext ? ? ?存放的數(shù)據(jù)僅在當(dāng)前頁(yè)面有效。開(kāi)發(fā)時(shí)使用較少。當(dāng)前頁(yè)面存放數(shù)據(jù)用表單標(biāo)簽中的?<input
      type="hidden" />,且該存值方式用戶看不到。

          ServletRequest:?request ? ? ?存放的數(shù)據(jù)在一次請(qǐng)求(轉(zhuǎn)發(fā):可以傳數(shù)據(jù))內(nèi)有效。使用非常多。

          HttpSession:?session ? ? ? ??存放的數(shù)據(jù)在一次會(huì)話(多次請(qǐng)求)中有效。使用的比較多。例如:存放用戶的登錄信息、購(gòu)物車(chē)功能。

          ServletContext:?application ?存放的數(shù)據(jù)在整個(gè)應(yīng)用范圍內(nèi)都有效。因?yàn)榉秶?,?yīng)盡量少用。用于統(tǒng)計(jì)在線人數(shù)。

      ?

      十四、會(huì)話跟蹤

      *
      ? 會(huì)話概述

        1、什么是會(huì)話?如同打電話。

           會(huì)話可簡(jiǎn)單理解為:用戶開(kāi)一個(gè)瀏覽器,點(diǎn)擊多個(gè)超鏈接,訪問(wèn)服務(wù)器多個(gè)web資源,然后關(guān)閉瀏覽器,整個(gè)過(guò)程稱之為一個(gè)會(huì)話。

      ?

        2、會(huì)話過(guò)程要解決的問(wèn)題是什么?保持各個(gè)客戶端自己的數(shù)據(jù)。

          ? 每個(gè)用戶在使用瀏覽器與服務(wù)器進(jìn)行會(huì)話的過(guò)程中,不可避免各自會(huì)產(chǎn)生一些數(shù)據(jù),程序要想辦法為每個(gè)用戶保存這些數(shù)據(jù)。

          ?
      例如:用戶點(diǎn)擊超鏈接通過(guò)一個(gè)servlet購(gòu)買(mǎi)了一個(gè)商品,程序應(yīng)該想辦法保存用戶購(gòu)買(mǎi)的商品,以便于用戶點(diǎn)結(jié)帳servlet時(shí),結(jié)帳servlet可以得到用戶購(gòu)買(mǎi)的商品為用戶結(jié)帳。

          ? 思考:用戶購(gòu)買(mǎi)的商品保存在request或servletContext中行不行?答:不行。

        保存會(huì)話數(shù)據(jù)的兩種技術(shù):

          Cookie:是客戶端技術(shù),程序把每個(gè)用戶的數(shù)據(jù)以cookie的形式寫(xiě)給用戶各自的瀏覽器。

      ?     ?當(dāng)用戶使用瀏覽器再去訪問(wèn)服務(wù)器中的web資源時(shí),就會(huì)帶著各自的數(shù)據(jù)去。

      ? ?    這樣,web資源處理的就是用戶各自的數(shù)據(jù)了。

          HttpSession:Session是服務(wù)器端技術(shù),利用這個(gè)技術(shù),服務(wù)器在運(yùn)行時(shí)可以為每一個(gè)用戶的瀏覽器創(chuàng)建一個(gè)其獨(dú)享的HttpSession對(duì)象,

      ? ?    由于session為用戶瀏覽器獨(dú)享,所以用戶在訪問(wèn)服務(wù)器的web資源時(shí),可以把各自的數(shù)據(jù)放在各自的session中,

      ? ?    當(dāng)用戶再去訪問(wèn)服務(wù)器中的其它web資源時(shí),其它web資源再?gòu)挠脩舾髯缘膕ession中取出數(shù)據(jù)為用戶服務(wù)。

      ?

      *
      http協(xié)議的無(wú)狀態(tài)性


      無(wú)狀態(tài)是指,當(dāng)瀏覽器發(fā)送請(qǐng)求給服務(wù)器時(shí),服務(wù)器響應(yīng)客戶端請(qǐng)求。但是當(dāng)同一個(gè)瀏覽器再次發(fā)送請(qǐng)求給服務(wù)器時(shí),服務(wù)器并不知道它就是剛才那個(gè)瀏覽器。簡(jiǎn)單來(lái)說(shuō),就是服務(wù)器不會(huì)去記得你,所以就是無(wú)狀態(tài)協(xié)議。

      *
      ? JSP?Cookie 處理

      Cookie是存儲(chǔ)在客戶機(jī)的文本文件,它們保存了大量軌跡信息。在servlet技術(shù)基礎(chǔ)上,JSP顯然能夠提供對(duì)HTTP cookie的支持。

      通常有三個(gè)步驟來(lái)識(shí)別回頭客:

      * 服務(wù)器腳本發(fā)送一系列cookie至瀏覽器。比如名字,年齡,ID號(hào)碼等等。
      * 瀏覽器在本地機(jī)中存儲(chǔ)這些信息,以備不時(shí)之需。
      * 當(dāng)下一次瀏覽器發(fā)送任何請(qǐng)求至服務(wù)器時(shí),它會(huì)同時(shí)將這些cookie信息發(fā)送給服務(wù)器,然后服務(wù)器使用這些信息來(lái)識(shí)別用戶或者干些其它事情。
      JSP Cookie 處理需要對(duì)中文進(jìn)行編碼與解碼,方法如下:
      String str = java.net.URLEncoder.encode("中文","UTF-8"); //編碼 String str =
      java.net.URLDecoder.decode("編碼后的字符串","UTF-8"); // 解碼
        

      *
      Servlet Cookie 方法





      ?

      *
      使用JSP設(shè)置Cookie

      使用JSP設(shè)置cookie包含三個(gè)步驟:

      (1)創(chuàng)建一個(gè)Cookie對(duì)象:?調(diào)用Cookie的構(gòu)造函數(shù),使用一個(gè)cookie名稱和值做參數(shù),它們都是字符串。
      Cookie cookie = new Cookie("key","value");
        

      請(qǐng)務(wù)必牢記,名稱和值中都不能包含空格或者如下的字符:
      [ ] ( ) = , " / ? @ : ;
        

      (2) 設(shè)置有效期:調(diào)用setMaxAge()函數(shù)表明cookie在多長(zhǎng)時(shí)間(以秒為單位)內(nèi)有效。下面的操作將有效期設(shè)為了24小時(shí)。
      cookie.setMaxAge(60*60*24);
        

      (3) 將cookie發(fā)送至HTTP響應(yīng)頭中:調(diào)用response.addCookie()函數(shù)來(lái)向HTTP響應(yīng)頭中添加cookie。
      response.addCookie(cookie);
        

      *
      實(shí)例說(shuō)明
      <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE
      html> <html> <head> <meta charset="utf-8"> <title>表單提交</title> </head> <body>
      <form action="CookieDemo.jsp" method=GET> 站點(diǎn)名: <input type="text" name="name">
      <br /> 網(wǎng)址: <input type="text" name="url" /> <input type="submit" value="提交" />
      </form> </body> </html>
        
      <%@ page import="java.net.URLEncoder" %> <%@ page
      contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
      <% // 編碼,解決中文亂碼 String str =
      URLEncoder.encode(request.getParameter("name"),"utf-8"); // 設(shè)置 name 和 url
      cookie Cookie name = new Cookie("name", str); Cookie url = new Cookie("url",
      request.getParameter("url")); // 設(shè)置cookie過(guò)期時(shí)間為24小時(shí)。 name.setMaxAge(60*60*24);
      url.setMaxAge(60*60*24); // 在響應(yīng)頭部添加cookie response.addCookie( name );
      response.addCookie( url ); %> <html> <head> <title>設(shè)置 Cookie</title> </head>
      <body> <h1>設(shè)置 Cookie</h1> <ul> <li><p><b>網(wǎng)站名:</b> <%=
      request.getParameter("name")%> </p></li> <li><p><b>網(wǎng)址:</b> <%=
      request.getParameter("url")%> </p></li> </ul> </body> </html>




      ?

      *
      使用 JSP 讀取 Cookie


      想要讀取cookie,您就需要調(diào)用request.getCookies()方法來(lái)獲得一個(gè)javax.servlet.http.Cookie對(duì)象的數(shù)組,然后遍歷這個(gè)數(shù)組,使用getName()方法和getValue()方法來(lái)獲取每一個(gè)cookie的名稱和值。
      <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page
      import="java.net.*" %> <!DOCTYPE html> <html> <head> <meta
      http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>獲取
      Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null;
      // 獲取cookies的數(shù)據(jù),是一個(gè)數(shù)組 cookies = request.getCookies(); if( cookies != null ){
      out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length;
      i++){ cookie = cookies[i]; out.print("參數(shù)名 : " + cookie.getName());
      out.print("<br>"); out.print("參數(shù)值: " + URLDecoder.decode(cookie.getValue(),
      "utf-8") +" <br>"); out.print("------------------------------------<br>"); }
      }else{ out.println("<h2>沒(méi)有發(fā)現(xiàn) Cookie</h2>"); } %> </body> </html>
        



      *
      使用JSP刪除Cookie

      刪除cookie非常簡(jiǎn)單。如果您想要?jiǎng)h除一個(gè)cookie,按照下面給的步驟來(lái)做就行了:

      * 獲取一個(gè)已經(jīng)存在的cookie然后存儲(chǔ)在Cookie對(duì)象中。
      * 將cookie的有效期設(shè)置為0。
      * 將這個(gè)cookie重新添加進(jìn)響應(yīng)頭中。
      *
      實(shí)例演示

      下面的程序刪除一個(gè)名為"name"的cookie,當(dāng)您第二次運(yùn)行CookieDemo2.jsp時(shí),name 將會(huì)為 null。
      <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page
      import="java.net.*" %> <!DOCTYPE html> <html> <head> <meta
      http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>獲取
      Cookie</title> </head> <body> <% Cookie cookie = null; Cookie[] cookies = null;
      // 獲取當(dāng)前域名下的cookies,是一個(gè)數(shù)組 cookies = request.getCookies(); if( cookies != null ){
      out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length;
      i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("name") == 0 ){
      cookie.setMaxAge(0); response.addCookie(cookie); out.print("刪除 Cookie: " +
      cookie.getName( ) + "<br/>"); } out.print("參數(shù)名 : " + cookie.getName());
      out.print("<br>"); out.print("參數(shù)值: " + URLDecoder.decode(cookie.getValue(),
      "utf-8") +" <br>"); out.print("------------------------------------<br>"); }
      }else{ out.println("<h2>沒(méi)有發(fā)現(xiàn) Cookie</h2>"); } %> </body> </html>
        

      ?



      ?



      *
      圖解分析





      ?

      *
      Session

      *
      HttpSession概述

      HttpSession是有JavaWeb提供的,用來(lái)會(huì)話跟蹤的類(lèi),session是服務(wù)器對(duì)象,保存在服務(wù)器端;


      HttpSession是Servlet三大域?qū)ο笾唬╮equest、session、application),所以它也有setAttribute()、getAttribute()、removeAttribute()方法;

      HttpSession底層依賴Cookie,或是URL重寫(xiě)。

      *
      HttpSession的作用

      * 會(huì)話范圍:會(huì)話范圍是某個(gè)用戶從首次訪問(wèn)服務(wù)器開(kāi)始,到該用戶關(guān)閉瀏覽器結(jié)束;
      會(huì)話:一個(gè)用戶對(duì)服務(wù)器的多次連貫性請(qǐng)求,所謂連貫性請(qǐng)求,就是該用戶多次請(qǐng)求中間沒(méi)有關(guān)閉瀏覽器。

      *
      服務(wù)器會(huì)為每個(gè)客戶端創(chuàng)建一個(gè)session對(duì)象,session就好比客戶在服務(wù)器端的賬戶,它們被服務(wù)器保存到一個(gè)Map中,這個(gè)Map被稱為session緩存。
      Servlet中得到session對(duì)象:HttpSession session = request.getSession();

      JSP中得到session對(duì)象:session是jsp內(nèi)置對(duì)象之下,不用創(chuàng)建就可以直接使用。

      *
      session域相關(guān)方法
      void setAttribute(String name,Object val); Object getAttribute(String name);
      void removeAttribute(String name);
         

      *
      session保存用戶登錄信息

      * 案例相關(guān)頁(yè)面和Servlet:
      login.jsp 登錄頁(yè)面

      LoginSuccess.jsp 只有登錄成功才能訪問(wèn)的頁(yè)面

      LoginServlet:校驗(yàn)用戶是否登錄成功

      * 各頁(yè)面和Servlet內(nèi)容:
      login.jsp 提供登錄表單,提交表單請(qǐng)求LoginServlet

      LoginServlet 獲取請(qǐng)求參數(shù),校驗(yàn)用戶是否登錄成功

      失敗:保存錯(cuò)誤信息到request域,轉(zhuǎn)發(fā)到login.jsp,在login.jsp中顯示request域中的錯(cuò)誤信息;

      成功:保存用戶信息到session域中,重定向到LoginSuccess.jsp頁(yè)面,顯示session域中的用戶信息。

      LoginSuccess.jsp 從session域獲取用戶信息,如果不存在,顯示“您還沒(méi)有登錄”,存在則顯示用戶信息;

      只要用戶沒(méi)有關(guān)閉瀏覽器,session就一直存在,那么保存在session中的用戶信息也就一起存在,那么用戶訪問(wèn)LoginSuccess.jsp就會(huì)通過(guò)

      login.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE
      html> <html> <head> <title>登錄頁(yè)面</title> </head> <body> <% //獲取cookie的值 String
      name = ""; String pwd = ""; Cookie[] cs = request.getCookies(); if(cs!=null){
      for(Cookie c : cs){ if("username".equals(c.getName())){ name = c.getValue(); }
      if("pwd".equals(c.getName())){ pwd = c.getValue(); } } } %> <% //獲取request信息
      String message=""; String mess = (String)request.getAttribute("message");
      if(mess!=null){ message = mess; } %> <h1>用戶登錄</h1> <span color="red"><%=message
      %></span> <form action="/LoginServlet" method="post"> <p> 賬號(hào):<input type="text"
      name="username" value="<%=name %>" /> </p> <p> 密碼:<input type="password"
      name="pwd" value="<%=pwd %>" /> </p> <p> <input type="submit" value="登錄"> </p>
      </form> </body> </html>
        LoginServlet.java

      ?
      package com.demo.servlet; import javax.servlet.ServletException; import
      javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import
      java.io.IOException; @WebServlet("/LoginServlet") public class LoginServlet
      extends HttpServlet { @Override protected void doGet(HttpServletRequest req,
      HttpServletResponse resp) throws ServletException, IOException {
      doPost(req,resp); } public void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
      //設(shè)置請(qǐng)求的字符編碼 request.setCharacterEncoding("utf-8"); //接收客戶端請(qǐng)求 String username =
      request.getParameter("username"); String pwd = request.getParameter("pwd");
      //判斷是否登錄成功 if("admin".equals(username) && "1234".equals(pwd)){
      //登錄成功,把信息保存到cookie中 Cookie c1 = new Cookie("username",username); Cookie c2 =
      new Cookie("pwd",pwd); c1.setMaxAge(60*60*24); c2.setMaxAge(60*60*24);
      response.addCookie(c1); response.addCookie(c2);
      //登錄成功,保存用戶名到session中,并重定向到LoginSuccess.jsp HttpSession session =
      request.getSession(); session.setAttribute("username", username);
      response.sendRedirect("/LoginSuccess.jsp"); }else{ //轉(zhuǎn)發(fā)給客戶端“登錄失敗”
      request.setAttribute("message", "用戶信息錯(cuò)誤,請(qǐng)重新登錄");
      request.getRequestDispatcher("/login.jsp").forward(request, response); } } }
        

      LoginSuccess.jsp

      ?
      <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE
      html> <html> <head> <title>登錄成功</title> </head> <body> <% //獲取session信息 String
      name = (String)session.getAttribute("username"); if(name==null){
      //session不存在,轉(zhuǎn)發(fā)到登錄頁(yè)面,并提示信息 request.setAttribute("message", "您還沒(méi)有登錄,不能訪問(wèn)頁(yè)面");
      request.getRequestDispatcher("/login.jsp").forward(request, response);
      //重定向到login.jsp,不會(huì)顯示request提示的信息 //response.sendRedirect("/login/login.jsp");
      return; } %> <h1>登錄成功</h1> 你好<%=name %>,歡迎登錄! </body> </html>
      ?

        



      *
      隱藏表單域

      一個(gè)網(wǎng)絡(luò)服務(wù)器可以發(fā)送一個(gè)隱藏的HTML表單域和一個(gè)唯一的session ID,就像下面這樣:
      <input type="hidden" name="sessionid" value="12345">
        


      這個(gè)條目意味著,當(dāng)表單被提交時(shí),指定的名稱和值將會(huì)自動(dòng)包含在GET或POST數(shù)據(jù)中。每當(dāng)瀏覽器發(fā)送一個(gè)請(qǐng)求,session_id的值就可以用來(lái)保存不同瀏覽器的軌跡。

      這種方式可能是一種有效的方式,但點(diǎn)擊<A HREF>標(biāo)簽中的超鏈接時(shí)不會(huì)產(chǎn)生表單提交事件,因此隱藏表單域也不支持通用會(huì)話跟蹤。

      *
      重寫(xiě)URL

      您可以在每個(gè)URL后面添加一些額外的數(shù)據(jù)來(lái)區(qū)分會(huì)話,服務(wù)器能夠根據(jù)這些數(shù)據(jù)來(lái)關(guān)聯(lián)session標(biāo)識(shí)符。

      舉例來(lái)說(shuō),http://w3cschool.cc/file.htm;sessionid=12345,
      session標(biāo)識(shí)符為sessionid=12345,服務(wù)器可以用這個(gè)數(shù)據(jù)來(lái)識(shí)別客戶端。

      相比而言,重寫(xiě)URL是更好的方式來(lái),就算瀏覽器不支持cookies也能工作,但缺點(diǎn)是您必須為每個(gè)URL動(dòng)態(tài)指定session
      ID,就算這是個(gè)簡(jiǎn)單的HTML頁(yè)面。

      * session依賴Cookie,目的是讓客戶端發(fā)出請(qǐng)求時(shí)歸還sessionID,這樣才能找到對(duì)應(yīng)的session;
      * 如果客戶端禁用了Cookie,那么就無(wú)法得到sessionID,那么session也就無(wú)用了;
      * 也可以使用URL重寫(xiě)來(lái)替代Cookie
      * 讓網(wǎng)站的所有超鏈接、表單中都添加一個(gè)特殊的請(qǐng)求參數(shù),即sessionID;
      * 這樣服務(wù)器可以通過(guò)獲取請(qǐng)求參數(shù)得到sessionID,從而找到session對(duì)象;
      * response.encodeURL(String
      url)該方法會(huì)對(duì)url進(jìn)行智能的重寫(xiě),當(dāng)請(qǐng)求中沒(méi)有歸還session這個(gè)Cookie,那么該方法會(huì)重寫(xiě)URL,否則不重寫(xiě),當(dāng)然url必須是指向本站的url。
      *
      session對(duì)象

      除了以上幾種方法外,JSP利用servlet提供的HttpSession接口來(lái)識(shí)別一個(gè)用戶,存儲(chǔ)這個(gè)用戶的所有訪問(wèn)信息。


      默認(rèn)情況下,JSP允許會(huì)話跟蹤,一個(gè)新的HttpSession對(duì)象將會(huì)自動(dòng)地為新的客戶端實(shí)例化。禁止會(huì)話跟蹤需要顯式地關(guān)掉它,通過(guò)將page指令中session屬性值設(shè)為false來(lái)實(shí)現(xiàn),就像下面這樣:
      <%@ page session="false" %>
        

      JSP引擎將隱含的session對(duì)象暴露給開(kāi)發(fā)者。由于提供了session對(duì)象,開(kāi)發(fā)者就可以方便地存儲(chǔ)或檢索數(shù)據(jù)。

      下表列出了session對(duì)象的一些重要方法:

      ?

      ?

      ?

      ?

      *
      Session與Cookie的對(duì)比



      ?

      ?

      *
      HttpSession原理

      服務(wù)器不會(huì)馬上給你創(chuàng)建session,在第一次獲取session時(shí),即reques.getSession()方法執(zhí)行時(shí),才會(huì)創(chuàng)建session。

      獲取Cookie中的JSESSIONID:

      * ? 如果sessionID不存在,創(chuàng)建session,把session保存起來(lái),把新創(chuàng)建的sessionID保存到Cookie中;
      * ?
      如果sessionID存在,創(chuàng)建sessionID查找session對(duì)象,如果沒(méi)有查找到,創(chuàng)建session,把session保存起來(lái),把新創(chuàng)建的sessionID保存到Cookie中;
      * ? 如果sessionID存在,通過(guò)sessionID查找到了session對(duì)象,那么就不會(huì)再創(chuàng)建session對(duì)象了;
      * ?
      如果創(chuàng)建新的session,瀏覽器會(huì)得到一個(gè)包含了sessionID的Cookie,這個(gè)Cookie的生命為-1,即只在瀏覽器內(nèi)存中存在,如果不關(guān)閉瀏覽器,那么Cookie就會(huì)一直存在;
      * ?
      下次請(qǐng)求時(shí),再執(zhí)行request.getSession()方法時(shí),因?yàn)榭梢酝ㄟ^(guò)Cookie中的sessionID找到session對(duì)象,所以與上一次請(qǐng)求使用的是同一個(gè)session對(duì)象。
      * ? request.getSession(false):如果Cookie不存在,session也不存在,那么返回NULL,而不會(huì)創(chuàng)建session對(duì)象;
      * ?
      request.getSession(true)/request.getSession():兩個(gè)方法一樣,當(dāng)session對(duì)象不存在時(shí),創(chuàng)建session對(duì)象
      * ? String getId() 獲取sessionID;
      * ? int getMaxInactiveInterval()
      獲取session最大的不活動(dòng)時(shí)間(秒),默認(rèn)為30分鐘,當(dāng)session在30分鐘內(nèi)沒(méi)有使用,那么Tomcat就會(huì)在session池中移除;
      * ? void invalidate()
      讓session失效,調(diào)用這個(gè)方法會(huì)讓session失效,當(dāng)session失效后,客戶端再次請(qǐng)求,服務(wù)器會(huì)給客戶端一個(gè)新的session;
      * ? boolean isNew() 查看session是否為新的,判斷是新創(chuàng)建的,還是從Cookie獲取的;
      ?

      (未完待續(xù))

      此篇是我在學(xué)習(xí)過(guò)程中參考菜鳥(niǎo)教程以及筆記和別人博客(黑澤君)完成

      Java匹馬行天下依舊在更新中,歡迎大家關(guān)注,感覺(jué)可以的可以點(diǎn)擊一下推薦,若如有誤,感謝指正,謝謝!

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問(wèn)題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          91社SHE在线观看 | 韩国黄色小视频 | 大香蕉伊阴网 | 三级不卡视频 | 91aaa| 啪啪啪网站在线播放 | 积积桶肤肤免费软件大全2025 | 深爱开心激情五月天 | 欧美乱伦一区 | 国产aaa视频 |