热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Springboot使用session容器存取短信验证码

Springboot使用session容器存取短信验证码,(手抖挖了坑在@WebListener类声明时候加了个abstract导致springboot扫描不到这个监听器)需求:为

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

Springboot使用session容器存取短信验证码

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.xxxxx.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注入Listener

 1 package com.xxxxx.api.config;
 2 
 3 import com.xxxxxxx.api.listener.SessionListener;
 4 import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
 5 import org.springframework.context.annotation.Bean;
 6 import org.springframework.context.annotation.Configuration;
 7 
 8 /**
 9  * @Auther: 
10  * @Date: 2018/6/23 09:59
11  * @Description:
12  */
13 @Configuration
14 public class ListenerConfigure {
15     @Bean
16     public ServletListenerRegistrationBean serssionListenerBean(){
17         ServletListenerRegistrationBean
18                 sessiOnListener= new ServletListenerRegistrationBean(new SessionListener());
19         return sessionListener;
20     }
21 
22 }

 


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
贰少爷闯天涯_964
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有