Servlet+Session+Cookie登入、校驗、退出的邏輯程式碼

詩水人間發表於2021-01-05

登入邏輯的例項程式碼,邏輯在我加的註釋上,閱讀帶就能掌握整個完整的 輸入使用者資訊,進行校驗,登入成功後的邏輯操作,登入失敗後的邏輯操作

下面用到的依賴:

(maven倉庫地址直鏈):servlet-apifastjson

登入邏輯

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    public static final HashMap<String, HttpSession> sessionHashMap = new HashMap<>();// 這個物件可以作為一個全域性變數

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        System.out.println("===============>進行登入");
        /**
         * 讀取前端傳來的資料
         */
        // 讀取前端傳來的json資料
        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "utf-8"));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        //將json字串轉換為json物件
        JSONObject json = JSONObject.parseObject(sb.toString());
        System.out.println(sb.toString());// 列印一下前端傳來的json資料
        /**
         * jdbc操作,進行資料校驗,校驗使用者名稱和密碼
         * 
         */

        boolean validate = true; // jdbc得到校驗結果
        if (validate) {
            /**
             * 1.校驗成功邏輯
             */
            final HttpSession session = request.getSession();// 得到session物件,可以存入HashMap中,作為value,id作為key
            final String sessionId = session.getId();// 得到session的id
            sessionHashMap.put(sessionId, session);// 將登入成功的session儲存起來,可以設定session的過期時間等操作
            final Cookie userCookie = new Cookie("sessionId", sessionId); // 建立cookie
            final Cookie userInfo = new Cookie("user", json.toJSONString()); // 將登入成功的使用者資訊通過cookie存入瀏覽器的cookie中
            response.addCookie(userCookie);// 新增cookie到響應體中,會存入到瀏覽器的cookie中,下次請求自動帶上
            response.addCookie(userInfo);// 返回給瀏覽器用於登入成功後顯示使用者資訊
            response.sendRedirect("/index.html");// 重定向到首頁
        } else {
            /**
             * 2.校驗失敗邏輯
             */
            response.sendRedirect("/登入.html");// 重定向到登入頁面
        }


        
    }

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

寫這篇部落格的意義是,總是遇到有人問,最最主要的原因是很多培訓機構講的也就這塊內容,為了方便,我將程式碼貼上出來,可以借鑑我寫的邏輯。

校驗登入

前面我們登入成功了,對於後端的請求都應該進行攔截,通過查詢上面儲存到session物件中的資訊來判斷請求是否是已經登入的使用者、是否已登入。

例如有一個購物車的後端介面/shopcart則在對應的doPost方法中將requestresponse物件傳給/validate中的doPost方法中進行校驗即可

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;

/**
 * 每一個請求都需要通過這個請求進行校驗
 */
@WebServlet("/validate")
public class ValidateServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final HashMap<String, HttpSession> sessionHashMap = LoginServlet.sessionHashMap;//得到所有登入成功的session
        final Cookie[] cookies = request.getCookies();// 得到所有cookie資訊
        // java8流遍歷
        Arrays.stream(cookies).forEach(cookie -> {
            // 遍歷cookie找到表示使用者資訊的sessionId這條資料
            if (cookie.getName().equals("sessionId")) {
                // 找到了這條cookie
                final String sessionId = cookie.getValue();// 得到sessionId
                final HttpSession httpSession = sessionHashMap.get(sessionId);// 得到session物件
                if (httpSession != null) {
                    // session存在
                    final Object username = httpSession.getAttribute("username"); // 得到儲存在session中的使用者名稱
                    final Object password = httpSession.getAttribute("password"); // 得到儲存在session中的使用者密碼
                    if (username != null && password != null) {
                        String name=(String) username;// 進行強轉
                        String pwd=(String) password;
                        /**
                         * jdbc操作校驗使用者名稱和密碼
                         *
                         */
                        boolean validate=true;// 校驗結果賦值給這個boolean變數

                        if (validate){
                            // 校驗成功則更新一下session的過期時間
                            httpSession.setMaxInactiveInterval(30 * 60);//設定單位為秒,設定為-1永不過期,這個值是30分鐘
                        }else {
                            // 校驗失敗則跳轉到登入頁面
                            try {
                                response.sendRedirect("/index.html");
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });

    }

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

退出登入

通過cookie.setMaxAge(0);// 刪除cookie設定過期時間為0,覆蓋瀏覽器的這條記錄,讓瀏覽器自動刪除這條cookie

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final HashMap<String, HttpSession> sessionHashMap = LoginServlet.sessionHashMap;//得到所有登入成功的session
        final Cookie[] cookies = request.getCookies();// 得到所有cookie資訊
        // java8流遍歷
        Arrays.stream(cookies).forEach(cookie -> {
            // 遍歷cookie找到表示使用者資訊的sessionId這條資料
            if (cookie.getName().equals("sessionId")) {
                // 找到了這條cookie
                final String sessionId = cookie.getValue();// 得到sessionId
                sessionHashMap.remove(sessionId);// 直接移除這條session記錄
                cookie.setMaxAge(0);// 刪除cookie
                response.addCookie(cookie);// 傳給瀏覽器進行過期自動刪除處理
            }
        });
    }

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

相關文章