Springboot使用session容器存取短信驗證碼
阿新 • • 發佈:2018-06-23
lis col 結果 gin 請求 scrip void ssi 不知道
Springboot使用session容器存取短信驗證碼,(手抖挖了坑在@WebListener類聲明時候加了個abstract導致springboot掃描不到這個監聽器)
需求:為了給app做接口,在session中存取短信驗證碼,接口速速擼好swagger測試從session中拿短信驗證碼信息66的沒問題(因為在瀏覽器範圍訪問,訪問的時候請求頭自動帶著sessionid的所以沒問題),當用postman測試拿到的session內容是null(原因是像手機app或者postman請求時候並沒有帶sessionid,所以讓服務端給你取session數據它並不知道從哪個盒子裏拿數據故而拿不到數據 )
實現結果:在springboot環境中,自定義session容器實現通過sessionId獲取session
app手機驗證碼存取兩種方式:
方式一:數據庫或者Redis等緩存存取,略。
方式二:session存取如下,註:沒有做刪除
話不多說,直接上代碼:
1、在啟動類頭上加掃描註解:
@ServletComponentScan
2、session容器類
1 package com.xxx.api.listener; 2 3 import javax.servlet.http.HttpSession; 4 import java.util.HashMap; 5 6 /**7 * @Auther: 8 * @Date: 2018/6/22 18:58 9 * @Description: 10 */ 11 public class SessionContext { 12 private static SessionContext instance; 13 private HashMap mymap; 14 15 private SessionContext() { 16 mymap = new HashMap(); 17 } 18 19 public static SessionContext getInstance() {20 if (instance == null) { 21 instance = new SessionContext(); 22 } 23 return instance; 24 } 25 26 public synchronized void AddSession(HttpSession session) { 27 if (session != null) { 28 mymap.put(session.getId(), session); 29 } 30 } 31 32 public synchronized void DelSession(HttpSession session) { 33 if (session != null) { 34 mymap.remove(session.getId()); 35 } 36 } 37 38 public synchronized HttpSession getSession(String session_id) { 39 if (session_id == null) return null; 40 return (HttpSession) mymap.get(session_id); 41 } 42 }
3、HttpSessionListener監聽類,當session產生的時候把session加入到容器裏,重點這裏加上註解
@WebListener
1 package com.xxxxx.api.listener; 2 3 import com.xn.api.app.login.ApiLoginController; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 7 import javax.servlet.annotation.WebListener; 8 import javax.servlet.http.HttpSession; 9 import javax.servlet.http.HttpSessionEvent; 10 import javax.servlet.http.HttpSessionListener; 11 import java.util.HashMap; 12 import java.util.Map; 13 14 /** 15 * @Auther: 16 * @Date: 2018/6/22 18:54 17 * @Description: 18 */ 19 @WebListener 20 public class SessionListener implements HttpSessionListener { 21 protected static Logger logger=LoggerFactory.getLogger(ApiLoginController.class); 22 23 24 public static Map userMap = new HashMap(); 25 private SessionContext sessionContext = SessionContext.getInstance(); 26 27 28 public void sessionCreated(HttpSessionEvent httpSessionEvent) { 29 HttpSession session = httpSessionEvent.getSession(); 30 logger.debug("info------>sessionCreated----->sessionId:" + session.getId()); 31 sessionContext.AddSession(session); 32 } 33 34 public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { 35 HttpSession session = httpSessionEvent.getSession(); 36 logger.debug("info------>sessionDeath----->sessionId:" + httpSessionEvent.getSession().getId()); 37 sessionContext.DelSession(session); 38 } 39 40 }
4、存取正常存取方式存取就可以
HttpSession httpSession = request.getSession(); //這個sessionId返回給APP,便於下次驗證請求時獲取session能根據sessionId獲取 String sessionId = httpSession.getId(); //httpsession存取數據 httpSession.setAttribute("電話", "驗證碼");
5、根據sessionId獲取session
//自定義session容器 SessionContext sessionContext= SessionContext.getInstance(); //從自定義session容器中拿到對應session HttpSession session = sessionContext.getSession(sessionId); String 驗證碼= String.valueOf(session.getAttribute("電話"));
完畢。
Springboot使用session容器存取短信驗證碼