1. 程式人生 > >Springboot使用session容器存取短信驗證碼

Springboot使用session容器存取短信驗證碼

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容器存取短信驗證碼