Redis框架(三):大众点评项目 基于Session的短信登录
大众点评项目 基于Session的短信登录
- 需求:基于Session实现短信验证登录
- 基于Session的短信登录
- 发送手机验证码
- 实现登录 (注意MyBatisP的接口使用)
- 新的问题
SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评
主要依照以下几个原则
- 基础+实战的Demo和Coding上传到我的代码仓库
- 在原有基础上加入一些设计模式,stream+lamdba等新的糖
- 通过DeBug调试,进入组件源码去分析底层运行的规则和设计模式
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
Session-链接: RedisProjectDemo
Redis优化-链接: RedisProject
需求:基于Session实现短信验证登录
本项目是一个前后端分离项目,系统框架和展示如下
我们希望在登录可以通过短信验证方式进行注册/登录
基于Session的短信登录
我们获得前端参数,实现登录验证功能
我们先给出架构图
发送手机验证码
@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {// TODO 发送短信验证码并保存验证码
// return Result.fail("功能未完成");return userService.sendCode(phone, session);}
public interface IUserService extends IService<User> {Result sendCode(String phone, HttpSession session);Result login(LoginFormDTO loginForm, HttpSession session);
}
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone, HttpSession session) {if(RegexUtils.isPhoneInvalid(phone)){return Result.fail("手机号码格式错误!");}String code = RandomUtil.randomNumbers(6);//模拟发短信,将验证码放到sessionsession.setAttribute("code", code);log.debug("发送短信验证码成功: "+ code);return Result.ok();}
实现登录 (注意MyBatisP的接口使用)
- @RequestBody是为了封装信息,实现自动配置
- @RequestParam对应了前端传来的参数对应
/*** 登录功能* @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码*/@PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){// TODO 实现登录功能
// return Result.fail("功能未完成");return userService.login(loginForm, session);}
public interface IUserService extends IService<User> {Result sendCode(String phone, HttpSession session);Result login(LoginFormDTO loginForm, HttpSession session);
}
@Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//从前端拿到对应的手机号String phone = loginForm.getPhone();if ((RegexUtils.isPhoneInvalid(phone))) {return Result.fail("手机格式错误!");}String code = loginForm.getCode();//获取对应的codeObject cacheCode = session.getAttribute("code");if (cacheCode == null || !cacheCode.toString().equals(code)) {return Result.fail("验证码错误!");}// 这里是MyBatisP的命令User user = query().eq("phone", phone).one();//如果没有就去创建一个Userif(user==null){user = createUserWithPhone(phone);}//将user通过BeanUtil工具类封装到DTO对象session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));return Result.ok();}
将user通过BeanUtil工具类封装到DTO对象,可以大大减少不必要数据的传输
所以设置了DTO层封装数据处理
private User createUserWithPhone(String phone) {User user = new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomString(8));save(user);return user;}
- 通过ThreadLocal存放当前对象,实现全局获取效果;
public class UserHolder {private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
- 实现拦截器进行登录验证
因为要对 限制的资源进行验证,所以使用了拦截器来进行处理;
public class LoginInterceptor1 implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public LoginInterceptor1(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Object user = request.getSession().getAttribute("user");if (user == null) {response.setStatus(401);return false;}UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);UserHolder.saveUser(userDTO);return true;}@Overridepublic void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exceptionex) throws Exception {//保存到当前线程中,直接remove即可UserHolder.removeUser();System.out.println("123");}}
这里的构造注入是因为
private StringRedisTemplate stringRedisTemplate; public LoginInterceptor1(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; }
这里的LoginInterceptor
是通过new来实现的,没有配置到Bean工厂中去,所以通过这种方式实现
后面的配置类中会进行注入
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/shop/**","voucher/**","shop-type/**","upload/**","/blog/hot","/user/code","/user/login");}
}
这里是为了拦截请求,做限制处理
新的问题
Redis框架(三):大众点评项目 基于Session的短信登录相关推荐
- 基于Session实现短信登录
目录 一.基于Session实现登录 1.1 业务流程图编辑 二.发送短信验证码 2.1 发送短信请求方式及参数说明 2.2 业务层代码模拟发送短信 三.登录功能 3.1 短信验证的请求方式及路径 ...
- SpringBoot基于Session实现短信验证码登录
- 黑马点评项目-短信登录功能
一.导入黑马点评项目 1.代码下载 视频资源链接:P25 实战篇-02.短信登录-导入黑马点评项目 代码可以直接去黑马微信公众号上搜索,或者从下面的网盘链接中下载:链接: https://pan.ba ...
- Redis实战——短信登录
目录 1 基于Seesion实现短信登录 1.1 发送短信验证码 1.2 登录功能 2 使用Redis进行短信验证码校验登录 2.1 Seesion方法存在的问题 2.2 发送短信验证码 2.3 验 ...
- redis的实战项目01_模拟短信登录业务
redis的实战项目01_短信登录 一.导入黑马点评项目 1. 数据库: 2. 单体项目介绍: 二.基于session实现登录 1.发送短信验证码 1.理论流程 2.代码操作: 2.短信验证码登录.注 ...
- 魔方APP项目-06-用户注册,完成短信验证码的校验、基于Celery实现短信异步发送、用户登录,jwt登陆认证、服务端提供用户登录的API接口
一.用户注册- 1.完成短信验证码的校验 application.utils.language.message,代码: class ErrorMessage():ok = "ok" ...
- 24、短信登录(基于redis实现短信登录)
短信登录(基于redis实现短信登录) 修改代码(之前的基于session) 发送验证的逻辑:(更改就是将短信验证码存到redis中) 第一步:注入SrtingRedisTemplate (users ...
- Redis(五) - Redis企业实战之短信登录
文章目录 一.导入黑马点评项目 1. 导入SQL 2. 前后端分离 3. 导入后端项目 3.1 将后端项目导入到 Idea 中 3.2 注意:修改application.yaml文件中的mysql.r ...
- 《Redis实战篇》一、短信登录
1.1.导入黑马点评项目 1.1.1 .导入SQL 1.1.2.有关当前模型 手机或者app端发起请求,请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开 ...
最新文章
- android 是否允许打印debug级别日志的开关_Android学习——日志使用
- 实际用户ID,有效用户ID与保存设置用户ID
- Google开源OCR项目Tesseract安装版在Windows下的使用测试记录
- MATLAB crc.generato,matlab中CRC的函数使用
- timestamp 转换 date mysql_MySQL时间函数 | 时间戳和日期之间得转换
- C++设计模式-Prototype原型模式
- 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
- 上班上累了,辞职做全职网红!马斯克语出惊人...
- crontab每小时运行一次(转)
- 【Python 12】汇率兑换5.0(Lambda函数)
- mysql有热备吗_mysql备份方法(热备)
- RHEL7的安装步骤
- AutoCAD二次开发1-环境配置
- 桌面计算机快捷打不开,桌面快捷方式打不开怎么办【解决方法】
- 彻底关闭windows安全中心
- 人类简史 从动物到上帝
- 用python画篮球场_如何使用 Python 创建一个 NBA 得分图?
- 【Hackintosh】暗影精灵2pro完美EFI分享
- 如何辨别优劣高防服务器?
- Excel 金额大写
热门文章
- Matlab光纤光栅仿真程序FBG 双FBG
- dz程序上传服务器的位置,dz手机端上传到远程服务器
- uni-app--》什么是uniapp?如何开发uniapp?
- 计算机系vlog,华为Mate40系列化身vlog神器,专业好用两手抓
- 10.原码、反码、补码
- Tungsten Fabric SDN — 与 Kubernetes 的集成部署(CN)
- Kingbase数据库
- 原创 基于微信小程序毕业设计题目选题课题 羽毛球篮球足球乒乓球场地球馆预约小程序的设计与实现(3)我的预约列表
- vr全景视频是如何拍摄的呢,商家为何要进行拍摄全景
- 基于Android的MediaPlayer的音乐播放器的封装