Servlet+Session+Cookie登入、校驗、退出的邏輯程式碼
登入邏輯的例項程式碼,邏輯在我加的註釋上,閱讀帶就能掌握整個完整的 輸入使用者資訊,進行校驗,登入成功後的邏輯操作,登入失敗後的邏輯操作
下面用到的依賴:
(maven倉庫地址直鏈):servlet-api 、fastjson
登入邏輯
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
方法中將request
和response
物件傳給/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);
}
}
相關文章
- 聊聊小程式的登入邏輯
- 登入邏輯中的驗證碼顯示策略優化優化
- SSO單點登入邏輯
- json web token 實踐登入以及校驗碼驗證JSONWeb
- 修改 jetstream laravel/fortify 登入邏輯Laravel
- Auth Session 退出他人正登入的賬號、passport 退出登入SessionPassport
- Flask——登入、退出Flask
- 培養程式碼邏輯
- SAP UI5 Currency 資料型別的校驗邏輯分析UI資料型別
- 一個登入點兩個邏輯漏洞-edusrc
- Spring Security 一鍵接入驗證碼登入和小程式登入Spring
- 華為遊戲登入校驗異常遊戲
- 如何自定義 SAP UI5 字串型別輸入欄位的校驗邏輯試讀版UI字串型別
- uniapp 完成兩種方式登入 驗證碼登入 密碼登入APP密碼
- 變數C++邏輯程式碼變數C++
- 如何給SAP Cloud for Customer UI上的欄位新增自定義校驗邏輯CloudUI
- 登入驗證碼生成kaptcha(輸入驗證碼)APT
- Spring Boot退出登入注意點Spring Boot
- vue router+ vuex+ 首頁登入判斷邏輯Vue
- vscode原始碼分析【二】程式的啟動邏輯VSCode原始碼
- win10怎麼退出登入賬戶_win10電腦退出賬戶登入的方法Win10
- ASP.NET Core 中簡單Session登入校驗ASP.NETSession
- 前後端實現登入token攔截校驗後端
- Flutter 登入退出功能注意事項Flutter
- Java Servlet session實現登入退出JavaServletSession
- 邏輯漏洞的常見驗證手法
- AI「王道」邏輯程式設計的復興?清華提出神經邏輯機,已入選ICLRAI程式設計ICLR
- 織夢會員登入提示“資料校驗不對,程式返回”解決方法
- Linux程式排程邏輯與原始碼分析Linux原始碼
- 幽默:什麼是業務邏輯程式碼?
- SpringMVC(六) 攔截器和使用者登入校驗SpringMVC
- jwt加meta元資訊實現登入後校驗JWT
- 遊戲陪玩原始碼的登入方式,簡訊驗證碼登入的實現遊戲原始碼
- Cookie和Session的區別,Koa2+Mysql+Redis實現登入邏輯CookieSessionMySqlRedis
- 如何給 SAP ABAP ALV 報表的修改功能新增自定義校驗邏輯試讀版
- SpringBoot之網站的登陸註冊邏輯Spring Boot網站
- 純css實現輸入框placeholder動效及輸入校驗的示例程式碼CSS
- 校園門戶登入