基于Session实现短信登录
创始人
2024-04-02 22:13:44

目录

一、基于Session实现登录

1.1 业务流程图​编辑

二、发送短信验证码

2.1 发送短信请求方式及参数说明

2.2 业务层代码模拟发送短信

三、登录功能

 3.1  短信验证的请求方式及路径

3.2  业务层代码实现用户登录

3.3 拦截器——登录验证功能

三、隐藏用户敏感信息

四、session共享问题


一、基于Session实现登录

1.1 业务流程图

二、发送短信验证码

2.1 发送短信请求方式及参数说明

这个地方为什么需要session?  因为我们需要把验证码保存在session当中

/*** 发送手机验证码*/@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {// TODO 发送短信验证码并保存验证码
//        return Result.fail("功能未完成");return userService.sendCode(phone,session);}

2.2 业务层代码模拟发送短信

    @Overridepublic Result sendCode(String phone, HttpSession session) {
//      1.校验手机号if(RegexUtils.isPhoneInvalid(phone)){
//              说明:RegexUtils使我们封装的一个类   isCodeInvalid是里面的静态方法,在这个静态方法里面又调用了另外一个静态方法得以实现
//      2.如果不符合,返回错误信息return Result.fail("手机号格式错误");}//      3.符合,生成验证码    6代表生成的验证码的长度  RandomUtil使用这个工具类生成String code =  RandomUtil.randomNumbers(6);
//      4.保存验证码到session       key必须是一个字符串,value是一个对象session.setAttribute("code",code);
//      5.发送验证码
//        实现起来比较麻烦 我们使用日志假装发送log.debug("发送短信验证码成功,验证码:"+code);return Result.ok();}
}

三、登录功能

 3.1  短信验证的请求方式及路径

    /*** 登录功能* @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码*/@PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){// TODO 实现登录功能return userService.login(loginForm,session);}

3.2  业务层代码实现用户登录

流程图:

代码:

/*** 实现用户登录* @param loginForm  登录的参数* @param session* @return*/@Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {
//      1.校验手机号if(RegexUtils.isPhoneInvalid(loginForm.getPhone())){
//              说明:RegexUtils使我们封装的一个类   isCodeInvalid是里面的静态方法,在这个静态方法里面又调用了另外一个静态方法得以实现
//          1.2.如果不符合,返回错误信息return Result.fail("手机号格式错误");}
//      2.校验验证码
//           2.1 得到code 这个值是真实的codeObject cacheCode = session.getAttribute("code");
//           2.2 获取用户输入的codeString code = loginForm.getCode();if(cacheCode ==null || !cacheCode.toString().equals(code)){
//      3.不一致,报错return Result.fail("验证码错误");}//      4.一致,根据手机号查询用户   .one()代表查询一个  list()代表着查询多个User user =query().eq("phone",loginForm.getPhone()).one();//      5.判断用户是否存在if(user ==null){
//      6.不存在,创建新用户并保存user = createUserWithPhone(loginForm.getPhone());}//      7.保存用户信息到session中session.setAttribute("user",user);return Result.ok();}private User createUserWithPhone(String phone) {
//      1.创建用户User user = new User();user.setPhone(phone);
//       USER_NICK_NAME_PREFIX其实就是 "user_",这样写更有逼格user.setNickName(USER_NICK_NAME_PREFIX+RandomUtil.randomString(10));
//        保存用户save(user);return user;}

3.3 拦截器——登录验证功能

// HandlerInterceptor 这是一个拦截器
public class LoginInterceptor implements HandlerInterceptor {
//  前置拦截   在进入controller之前我们进行登录校验@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//      1.获取sessionHttpSession session  =request.getSession();
//      2.获取session中的用户Object user = session.getAttribute("user");
//      3.判断用户是否存在if(user == null){// 4.不存在,拦截response.setStatus(401);  //返回401状态码return false;}
//      5.存在,保存用户信息到ThreadLocal  保存在当前线程里面的UserHolder.saveUser((User)user);
//      6.放行return true;}
//  在controller执行之后拦截  这个我们在这里不需要
//    @Override
//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
//    }//  渲染之后,返回给用户之前   用户业务执行完毕我们要销毁维护信息,避免泄露@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//      移除用户UserHolder.removeUser();}
}
public class UserHolder {private static final ThreadLocal tl = new ThreadLocal<>();public static void saveUser(User user){tl.set(user);}public static User getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
@Configuration
public class MvcConfig implements WebMvcConfigurer {//  拦截器的注册器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/code","/user/login","/shop/**","/blog/hot","/shop-type/**","upload/**","voucher/**");}
}
    @GetMapping("/me")public Result me(){// TODO 获取当前登录的用户并返回
//        直接取就可以了User user=  UserHolder.getUser();return Result.ok(user);}

三、隐藏用户敏感信息

如下图所示,服务器返回的信息有点多,我们为了保护用户的信息,我们需要隐藏部分的内容

所以一开始我们存入session的信息就不应该是完整的信息,这样才能降低服务器的压力

UserServiceImpl中的login方法

//      7.保存用户信息到session中   \
//         BeanUtil.copyProperties(user, UserDTO.class))  会自动的将user中的属性拷贝到UserDTO当中而且也创建出一个UserDTO对象session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));

取的时候我们也应该做出变化

LoginInterceptor类
//      5.存在,保存用户信息到ThreadLocal  保存在当前线程里面的UserHolder.saveUser((UserDTO)user);

此时我们再登录查询信息,就还剩下三个字段了

四、session共享问题

多台Tomcat并不共享session存储空间,当请求切换到不同的Tomcat服务导致数据丢失的问题

所以这个方案就被pass了

session的替代方案应该满足:

  • 数据共享
  • 内存存储
  • key、value结构

所以我们选择Redis

任何一台Tomcat都能访问到Redis,这样就能实现数据共享

有兴趣的朋友可以再对比一下Redis实现短信登录,两个对比学习

Redis替代Session实现用户短信登录(超级详细解释)_我爱布朗熊的博客-CSDN博客

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...