大众点评项目 基于Session的短信登录

  • 需求:基于Session实现短信验证登录
  • 基于Session的短信登录
    • 发送手机验证码
    • 实现登录 (注意MyBatisP的接口使用)
  • 新的问题

SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评
主要依照以下几个原则

  1. 基础+实战的Demo和Coding上传到我的代码仓库
  2. 在原有基础上加入一些设计模式,stream+lamdba等新的糖
  3. 通过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的接口使用)

  1. @RequestBody是为了封装信息,实现自动配置
  2. @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;}
  1. 通过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();}
}
  1. 实现拦截器进行登录验证
    因为要对 限制的资源进行验证,所以使用了拦截器来进行处理;
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的短信登录相关推荐

  1. 基于Session实现短信登录

    目录 一.基于Session实现登录 1.1 业务流程图​编辑 二.发送短信验证码 2.1 发送短信请求方式及参数说明 2.2 业务层代码模拟发送短信 三.登录功能 3.1  短信验证的请求方式及路径 ...

  2. SpringBoot基于Session实现短信验证码登录

  3. 黑马点评项目-短信登录功能

    一.导入黑马点评项目 1.代码下载 视频资源链接:P25 实战篇-02.短信登录-导入黑马点评项目 代码可以直接去黑马微信公众号上搜索,或者从下面的网盘链接中下载:链接: https://pan.ba ...

  4. Redis实战——短信登录

    目录 1 基于Seesion实现短信登录 1.1 发送短信验证码 1.2 登录功能 2 使用Redis进行短信验证码校验登录 2.1 Seesion方法存在的问题 2.2 发送短信验证码 2.3  验 ...

  5. redis的实战项目01_模拟短信登录业务

    redis的实战项目01_短信登录 一.导入黑马点评项目 1. 数据库: 2. 单体项目介绍: 二.基于session实现登录 1.发送短信验证码 1.理论流程 2.代码操作: 2.短信验证码登录.注 ...

  6. 魔方APP项目-06-用户注册,完成短信验证码的校验、基于Celery实现短信异步发送、用户登录,jwt登陆认证、服务端提供用户登录的API接口

    一.用户注册- 1.完成短信验证码的校验 application.utils.language.message,代码: class ErrorMessage():ok = "ok" ...

  7. 24、短信登录(基于redis实现短信登录)

    短信登录(基于redis实现短信登录) 修改代码(之前的基于session) 发送验证的逻辑:(更改就是将短信验证码存到redis中) 第一步:注入SrtingRedisTemplate (users ...

  8. Redis(五) - Redis企业实战之短信登录

    文章目录 一.导入黑马点评项目 1. 导入SQL 2. 前后端分离 3. 导入后端项目 3.1 将后端项目导入到 Idea 中 3.2 注意:修改application.yaml文件中的mysql.r ...

  9. 《Redis实战篇》一、短信登录

    1.1.导入黑马点评项目 1.1.1 .导入SQL 1.1.2.有关当前模型 手机或者app端发起请求,请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开 ...

最新文章

  1. android 是否允许打印debug级别日志的开关_Android学习——日志使用
  2. 实际用户ID,有效用户ID与保存设置用户ID
  3. Google开源OCR项目Tesseract安装版在Windows下的使用测试记录
  4. MATLAB crc.generato,matlab中CRC的函数使用
  5. timestamp 转换 date mysql_MySQL时间函数 | 时间戳和日期之间得转换
  6. C++设计模式-Prototype原型模式
  7. 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
  8. 上班上累了,辞职做全职网红!马斯克语出惊人...
  9. crontab每小时运行一次(转)
  10. 【Python 12】汇率兑换5.0(Lambda函数)
  11. mysql有热备吗_mysql备份方法(热备)
  12. RHEL7的安装步骤
  13. AutoCAD二次开发1-环境配置
  14. 桌面计算机快捷打不开,桌面快捷方式打不开怎么办【解决方法】
  15. 彻底关闭windows安全中心
  16. 人类简史 从动物到上帝
  17. 用python画篮球场_如何使用 Python 创建一个 NBA 得分图?
  18. 【Hackintosh】暗影精灵2pro完美EFI分享
  19. 如何辨别优劣高防服务器?
  20. Excel 金额大写

热门文章

  1. Matlab光纤光栅仿真程序FBG 双FBG
  2. dz程序上传服务器的位置,dz手机端上传到远程服务器
  3. uni-app--》什么是uniapp?如何开发uniapp?
  4. 计算机系vlog,华为Mate40系列化身vlog神器,专业好用两手抓
  5. 10.原码、反码、补码
  6. Tungsten Fabric SDN — 与 Kubernetes 的集成部署(CN)
  7. Kingbase数据库
  8. 原创 基于微信小程序毕业设计题目选题课题 羽毛球篮球足球乒乓球场地球馆预约小程序的设计与实现(3)我的预约列表
  9. vr全景视频是如何拍摄的呢,商家为何要进行拍摄全景
  10. 基于Android的MediaPlayer的音乐播放器的封装