Java Web 會話技術總結

DOONDO發表於2020-11-25

會話技術

會話概念

  • 一次會話中包含多次請求和響應。

    一次會話:瀏覽器第一次給伺服器資源傳送請求,會話建立,直到有一方斷開為止,一次會話結束。

會話的功能

  • 在一次會話的範圍內的多次請求間,共享資料。

會話實現的方式

  • 客戶端會話技術:Cookie
  • 服務端會話技術:Session
  • 概念:客戶端會話技術,將資料儲存到客戶端

快速入門

使用步驟

  1. 建立Cookie物件,繫結資料

    new Cookie(String name, String value);
    
  2. 服務端傳送Cookie到客戶端

    response.addCookie(Cookie cookie);
    
  3. 客戶端訪問新資源,攜帶Cookie資料

    Cookie[] cookies = request.getCookie();
    

專案實戰

  1. 案例編碼

    1. 寫Cookie資料到客戶端的Servlet

      package org.taoguoguo.cookie;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * @author taoguoguo
       * @description Cookie快速入門-寫Cookie資料到客戶端的Servlet
       * @website https://www.cnblogs.com/doondo
       * @create 2020-11-17 21:44
       */
      @WebServlet("/CookieDemo1")
      public class CookieDemo1 extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1.建立Cookie物件
              Cookie c = new Cookie("msg","hello");
              //2.傳送Cookie
              response.addCookie(c);
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    2. 獲取客戶端Cookie資料的Servlet

      package org.taoguoguo.cookie;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * @author taoguoguo
       * @description cookie快速入門-獲取客戶端Cookie資料
       * @website https://www.cnblogs.com/doondo
       * @create 2020-11-17 21:46
       */
      @WebServlet("/CookieDemo2")
      public class CookieDemo2 extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //3.獲取Cookie
              Cookie[] cookies = request.getCookies();
              //獲取資料,遍歷Cookie
              if(cookies!=null){
                  for(Cookie cookie:cookies){
                      System.out.println(cookie.getName() + "->" + cookie.getValue());
                  }
              }
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
      
    3. 輸出結果:

      msg->hello
      

Cookie實現原理

基於響應頭 set-cookie和請求頭cookie實現

客戶端請求訪問伺服器,伺服器將需要儲存到cookie裡面的內容,通過鍵值對形式寫到set-cookie頭中,然後將資料響應給客戶端;

客戶端再次傳送請求時,會將儲存在客戶端的Cookie資料,放在請求頭cookie中,提交給服務端,伺服器可獲取請求頭中Cookie的資料,進行資料,從而做到互動。

Cookie的細節

  1. 一次是否可以傳送多個Cookie?

    • 可以,服務端可以建立多個Cookie物件,使用response呼叫多次addCookie方法傳送Cookie即可。
  2. Cookie在瀏覽器中的有效時間?

    • 預設情況下,當瀏覽器關閉,Cookie資料被銷燬
    • 持久化儲存
    /*int 取值分類
    	正數:將Cookie資料寫到硬碟檔案中,持久化儲存,Cookie 存活時間(單位為:秒)
    	負數:預設值
    	零:刪除Cookie資訊
    */
    setMaxAge(int seconds)
    
    package org.taoguoguo.cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author taoguoguo
     * @description Cookie存活時間舉例
     * @website https://www.cnblogs.com/doondo
     * @create 2020-11-17 21:46
     */
    @WebServlet("/CookieDemo3")
    public class CookieDemo3 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.建立Cookie物件
            Cookie cookie = new Cookie("msg","setMaxAge");
            //2.設定Cookie的存活時間
            cookie.setMaxAge(30);   //將Cookie持久化硬碟,30後會自動刪除Cookie檔案
            //3.傳送Cookie
            response.addCookie(cookie);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
  3. Cookie是否可以儲存中文

    • Tomcat 8 之前,Cookie中不能直接儲存中文資料

      解決方案:將中文轉碼,一般採用URL編碼

      //存中文到Cookie編碼
      Cookie cookie = new Cookie("uname", URLEncoder.encode(uname,"utf-8"));
      //獲取Cookie解碼
      String value = URLDecoder.decode(cookie.getValue(),"utf-8");
      
    • Tomcat 8 之後,Cookie支援中文資料,但不支援特殊字元,依然可以通過URL編碼解決

  4. Cookie的獲取範圍多大?

    • 假設在一個Tomcat伺服器中,部署了多個web專案,那麼這些web專案的Cookie能否共享?

      • 預設情況下,Cookie不能共享

        //設定cookie的取值範圍 預設情況下,設定為當前的虛擬目錄也就是 request.getContext的值
        //如果需要共享,需要將path 設定為父級別目錄 
        //比如 /project1; /project2 兩個專案需要共享,則 setPath("/")	
        c.setPath(String path)	
        
    • 不同的Tomcat伺服器間Cookie共享問題?

      • 設定一級域名相同,那麼多個伺服器之間的Cookie可以共享

        /**
         比如,貼吧的域名為: tieba.baidu.com  而新聞的域名為 news.baidu.com
         其中 baidu.com 為一級域名 tieba、news 等為二級域名
         c.setDomain(".baidu.com") 那麼tieba.baidu.com 和 news.baidu.com中的Cookie可以共享
        */
        c.setDomain(String path);
        

Cookie的特點和作用

  1. Cookie儲存資料在客戶端瀏覽器
  2. 瀏覽器對於單個Cookie的大小限制,以及對同一個域名下的總Cookie數量也有限制(20個)

作用:

  1. cookie一般用於儲存少量的不太敏感的資料

  2. 在不登陸的情況下,伺服器對客戶端的身份的識別

    比如在百度瀏覽器未登入情況下做一些偏好設定,服務端發一個Cookie給瀏覽器,瀏覽器訪問時帶上這個Cookie,服務端就可以渲染對應的偏好設定

Cookie案例

需求:1。訪問一個Servlet,如果第一次訪問,則提示:您好,歡迎首次訪問;如果不是第一次訪問,則提示歡迎回來,您上次訪問時間為:顯示時間字串。

分析:

  • 可以採用Cookie來完成

  • 在伺服器中的Servlet來判斷是否有一個名為 lastTime的Cookie

    有:不是第一次訪問

    • 響應資料:歡迎回來,你上次訪問的時間為: 獲取lastTime中Cookie資料
    • 寫回Cookie, 更新Cookie時間的值

    沒有:第一次訪問

    • 響應資料,您好,歡迎你首次訪問
    • 寫回Cookie: lastTime:當前時間

案例程式碼:

package org.taoguoguo.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author taoguoguo
 * @description Cookie案例
 * @website https://www.cnblogs.com/doondo
 * @create 2020-11-17 21:46
 */
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設定響應訊息體的資料格式和編碼
        response.setContentType("text/html;charset=utf-8");
        //1.獲取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;   //預設沒有Cookie
        //2.遍歷Cookie陣列
        if(cookies!=null && cookies.length>0){
            for (Cookie cookie : cookies) {
                //3.獲取cookie的名稱
                String name = cookie.getName();
                //4.判斷名稱是否為 lastTime
                if("lastTime".equals(name)){
                    flag = true;
                    //Cookie存在,不是第一次訪問
                    String value = cookie.getValue();
                    value = URLDecoder.decode(value,"utf-8");
                    //獲取當前時間的字串,重新設定Cookie的值,重新傳送Cookie
                    String str_date = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
                    str_date = URLEncoder.encode(str_date, "utf-8");
                    cookie.setValue(str_date);
                    //設定Cookie的存活時間
                    cookie.setMaxAge(60*60);    //一小時
                    response.addCookie(cookie);
                    //cookie
                    response.getWriter().write("<h1>歡迎回來,您上次的訪問時間為: "+value+"</h1>");
                }
            }
        }

        if(cookies == null || cookies.length==0 || flag == false){
            //沒有 第一次訪問
            String str_date = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
            //時間輸出格式中空格特殊字元處理
            str_date = URLEncoder.encode(str_date, "utf-8");
            Cookie cookie = new Cookie("lastTime",str_date);
            //設定Cookie的存活時間
            cookie.setMaxAge(60*60);    //一小時
            response.addCookie(cookie);
            response.getWriter().write("<h1>您好,歡迎你首次訪問</h1>");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

JSP總結

JSP 概念

Java Server Page: Java服務端頁面,可以理解為一個特殊的頁面,既可以定義html標籤,又可以定義Java程式碼,用於簡化書寫。

JSP 原理

JSP 本質就是一個Servlet ,在啟動專案訪問 JSP 頁面時,我們的Tomcat容器空間中,會將JSP 檔案 編譯為一個 .java 檔案 然後Javac編譯為一個.class檔案 提供訪問。我們可以開啟 index.jsp 經過編譯 後的 index_jsp.java , 發現其繼承 自 org.apache.jasper.runtime.HttpJspBase,而 HttpJspBase 繼承自 HttpServlet, 所以說 JSP 本質 就是 Servlet

而這個Servlet 的 service 方法 做的事情 就是將我們的返回資料,通過輸出流 拼接html 標籤 ,從而實現頁面展示效果。

JSP 指令碼

  1. <% Java程式碼 %>
    • 定義的 Java程式碼在Jsp 轉換成 java後,位於Service方法中,Service 方法中可以怎麼寫,該指令碼語法就可以怎麼寫。
  2. <%! Java程式碼 %>
    • 定義的 Java程式碼 在Jsp 轉換成 java後,位於類的成員變數中,但這種一般用得比較少。因為servlet是單例的,多個執行緒同時訪問,如果值有修改,其他執行緒獲取時會存線上程安全問題,Servlet中一般推薦定義區域性變數。
  3. <%= Java程式碼 %>
    • 定義的Java程式碼,會輸出到頁面上。out.print()可以輸出什麼,該指令碼就可以定義什麼

JSP內建物件

在 JSP 頁面不需要獲取和建立,可以直接使用的物件

JSP一共有9個內建物件:

  1. request

  2. response

  3. out:字元輸出流物件,可以將資料輸出到頁面上。和response.getWriter()類似

    • response.getWriter() 和 out.write 的區別:

      tomcat 伺服器真正給客戶端做出響應之前,會先找 response 緩衝區資料,再找 out 緩衝區資料。response.getWriter() 資料輸出永遠再 out.write() 之前

Session

概念

伺服器端的會話技術,在一次會話的多次請求間共享資料,將資料儲存在伺服器端的物件中,HttpSession

快速入門

  1. 獲取 HttpSession 物件:

    • HttpSession session = request.getSession();
  2. 使用 HttpSession 物件:

    • Object getAttribute(String name);
    • void setAttribute(String name, Object value);
    • void removeAttribute(String name);
  3. 案例編碼

    • SessionDemo1設定Session資料

      package org.taoguoguo.session;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      /**
       * @author taoguoguo
       * @description ${NAME}
       * @website https://www.cnblogs.com/doondo
       * @create 2020-11-23 23:00
       */
      @WebServlet("/sessionDemo1")
      public class SessionDemo1 extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //使用Session共享資料
              //1.獲取Session
              HttpSession session = request.getSession();
              //2.儲存資料
              session.setAttribute("msg","hello session");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
    • SessionDemo2獲取Session資料

      package org.taoguoguo.session;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      /**
       * @author taoguoguo
       * @description ${NAME}
       * @website https://www.cnblogs.com/doondo
       * @create 2020-11-23 23:00
       */
      @WebServlet("/sessionDemo2")
      public class SessionDemo2 extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //使用Session獲取資料
              //1.獲取Session
              HttpSession session = request.getSession();
              //2.儲存資料
              Object msg = session.getAttribute("msg");
              System.out.println(msg);
      
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      

Session實現原理

思考SessionDemo1 和 SessionDemo2 是不是同一個Session呢? 答案是肯定的同一個。不然怎麼從Session中獲取到資料呢?

Session的實現是依賴於Cookie的,當伺服器建立一個Session時,會在內部記錄一個SessionId,而伺服器響應資料給客戶端時,會在響應頭中設定Cookie: JseesionId:sessionid值的方式,將建立的SessionId 發放到客戶端。而客戶端再次請求伺服器時,會將客戶端的Cookie:JessionId 傳送到服務端,服務端根據這個SessionId,就能獲取到對應ID的Session物件,拿到會話中的資料。

Session的細節

  1. 當客戶端關閉後,伺服器不關閉,兩次獲取的Session是否為同一個?

    • 預設情況下,不是。因為一次新的會話,從request中獲取的Session物件的SessionId是不一樣的。

    • 如果需要相同,可以通過建立Cookie,鍵為 JESSIONID,設定最大存活時間,讓Cookie持久化的方法來實現。因為Session是基於Cookie來是實現的,只要Cookie每次攜帶的JessionId相同,就是同一個Session。

      例項程式碼:

      package org.taoguoguo.session;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.*;
      import java.io.IOException;
      
      /**
       * @author taoguoguo
       * @description ${NAME}
       * @website https://www.cnblogs.com/doondo
       * @create 2020-11-23 23:00
       */
      @WebServlet("/sessionDemo3")
      public class SessionDemo3 extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //使用Session獲取資料
              //1.獲取Session
              HttpSession session = request.getSession();
              System.out.println(session);
              //期望客戶端關閉後,session也能相同
              Cookie cookie = new Cookie("JESSIONID",session.getId());
              cookie.setMaxAge(60*60);
              response.addCookie(cookie);
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      }
      
  2. 客戶端不關閉,伺服器關閉,兩次獲取的Session是同一個嗎?

    不是同一個,因為Session物件是由伺服器建立的,伺服器關閉,Session物件就記憶體就清空了。重啟後新建立的Session的地址值是隨機分配的。

    但現在有個場景,假設使用者在基於Session實現的購物車中,新增了N件商品,但準備下單時接到電話。接電話過程中,伺服器重啟。待電話結束後,點選下單,Session由於不是同一個物件資料丟失了該如何處理?

    • Session的鈍化:
      • 在伺服器正常關閉之前,將Session物件序列化到硬碟上
    • Session的活化:
      • 在伺服器啟動後,將Session檔案轉換為記憶體中的Session物件即可

    伺服器Tomcat已經實現了Session的鈍化和活化。將專案打成 war 包部署到Tomcat的 webapp 目錄下,正常啟動Tomcat,訪問儲存Session的Servlet, 當Tomcat正常關閉時,Tomcat 的 work 目錄會產生一個 SESSIONS.ser 的檔案,持久化Session的資料,當Tomcat再次啟動時,會將SESSION.ser 檔案資料載入到Tomcat記憶體中序列化為Session物件,從而拿到Session儲存的資料。

    但IDEA 編輯器只實現的Session的鈍化,沒有實現Session的活化。IDEA在啟動Tomcat時,會先刪除 work 目錄,然後新建work 目錄,獲取不到 Session.ser 檔案,及其儲存的資料。

  3. Session什麼時候被銷燬?

    • 伺服器關閉

    • session 物件呼叫 invalidate() 方法

    • session的預設失效時間為30分鐘

      Tomcat 的 web.xml 選擇性配置 設定Session時長:

      <session-config>
      	<session-timeout>30</session-timeout>
      </session-config>
      

Session的特點

  1. Session用於儲存一次會話的多次請求的資料,存在伺服器端。
  2. Session可以儲存任意型別,任意大小的資料。

Session與Cookie的區別

  1. Session 儲存資料在服務端,Cookie在客戶端
  2. Session沒有資料大小限制,Cookie有大小限制
  3. Session資料存在服務端較為安全,Cookie相對不安全

Session案例

案例需求

訪問帶有驗證碼的登入頁面,使用者輸入使用者名稱,密碼,及驗證碼

  • 如果使用者名稱和密碼輸入有誤,則跳轉至登入頁面,提示:使用者名稱或密碼錯誤
  • 如果驗證碼錯誤,跳轉登入頁面,提示:驗證碼錯誤
  • 如果全部輸入正確,則跳轉至主頁 success.jsp 顯示:使用者名稱,歡迎您

案例編碼:

  1. 驗證碼Servlet

    package org.taoguoguo.servlet;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    /**
     * @author taoguoguo
     * @description ${NAME}
     * @website https://www.cnblogs.com/doondo
     * @create 2020-11-24 23:33
     */
    @WebServlet("/checkCodeServlet")
    public class CheckCodeServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.建立一個影像緩衝區物件
            int width = 100;
            int height = 50;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
            //2.美化圖片
            //2.1填充背景色
            Graphics graphics = image.getGraphics();    //畫筆物件
            graphics.setColor(Color.pink);  //設定畫筆顏色
            graphics.fillRect(0,0,width,height);
            //2.2畫邊框
            graphics.setColor(Color.blue);
            graphics.drawRect(  0,0,width-1,height-1);
            //2.3寫驗證碼
            String code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789";
            //生成隨機角標
            Random random = new Random();
            StringBuilder builder = new StringBuilder();
            for (int i=1; i<=4; i++){
                int index = random.nextInt(code.length());
                //獲取字元
                char c = code.charAt(index);
                builder.append(c);
                graphics.drawString(String.valueOf(c),width/5*i,height/2);
            }
            //將驗證碼存入到Session
            String checkCode_session = builder.toString();
            request.getSession().setAttribute("checkCode_session",checkCode_session);
    
            //2.4畫干擾線
            graphics.setColor(Color.green);
            for(int i=0; i<10; i++){
                int x1 = random.nextInt(width);
                int y1 = random.nextInt(height);
    
                int x2 = random.nextInt(width);
                int y2 = random.nextInt(height);
                graphics.drawLine(x1,y1,x2,y2);
            }
            //3.將圖片輸出到頁面展示
            ImageIO.write(image,"jpg",response.getOutputStream());
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
  2. login.jsp

    <%--
      User: taoGuoGuo
      Date: 2020/11/24
      Time: 23:36
      WebSite: https://www.cnblogs.com/doondo/
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>login</title>
    
        <script>
            window.onload = function () {
                document.getElementById("img").onclick = function () {
                    this.src="/checkCodeServlet?time="+ new Date().getTime();
                }
            }
        </script>
        <style>
            div{
                color: red;
            }
        </style>
    
    </head>
    <body>
        <form action="/loginServlet" method="post">
            <table>
                <tr>
                    <td>使用者名稱</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>密碼</td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr>
                    <td>驗證碼</td>
                    <td><input type="text" name="checkCode"></td>
                </tr>
                <tr>
                    <td colspan="2"><img src="/checkCodeServlet" id="img"></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="登入"></td>
                </tr>
            </table>
        </form>
        <div><%=request.getAttribute("errorMsg") == null ? "": request.getAttribute("errorMsg")%></div>
    </body>
    </html>
    
  3. loginServlet

    package org.taoguoguo.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.util.Map;
    
    /**
     * @author taoguoguo
     * @description ${NAME}
     * @website https://www.cnblogs.com/doondo
     * @create 2020-11-24 23:47
     */
    @WebServlet("/loginServlet")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.設定request編碼
            request.setCharacterEncoding("utf-8");
            //2.獲取引數
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String checkCode = request.getParameter("checkCode");
            //3.先獲取生成的驗證碼
            HttpSession session = request.getSession();
            String checkCode_session = session.getAttribute("checkCode_session").toString();
            //刪除Session中儲存的驗證碼
            session.removeAttribute("checkCode_session");
            //4.先判斷驗證碼是否正確
            if (checkCode_session != null && checkCode_session.equalsIgnoreCase(checkCode)){
                //忽略大小寫比較
                //驗證碼正確
                //判斷使用者名稱和密碼是否一致
                if("zhangsan".equals(username) && "123".equals(password)){//需要查詢資料庫
                    //登入成功
                    //儲存使用者資訊,重定向到 success.jsp
                    session.setAttribute("user",username);
                    response.sendRedirect(request.getContextPath()+"/success.jsp");
                }else{
                    //儲存資訊到request
                    request.setAttribute("errorMsg","使用者名稱或密碼錯誤");
                    request.getRequestDispatcher("/login.jsp").forward(request,response);
                }
            }else{
                //驗證碼不一致
                //儲存資訊到request
                request.setAttribute("errorMsg","驗證碼錯誤");
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
  4. success.jsp

    <%--
      User: taoGuoGuo
      Date: 2020/11/25
      Time: 0:15
      WebSite: https://www.cnblogs.com/doondo/
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>success</title>
    </head>
    <body>
    <h1><%=request.getSession().getAttribute("user")%>,歡迎您</h1>
    </body>
    </html>
    

相關文章