1)实现手机验证码功能,用户注册功能,用户登入功能(这里讲开发流程,及本人遇到的问题,具体实现请看代码)

1、拦截请求,获取请求参数(这里的consumes是个常量,可以定义在baseController里)

  1. @RequestMapping(value="/register",method={RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
  1. @RequestParam(name="telphone")String telphone,
  2. @RequestParam(name="otpCode")String otpCode,
  3. @RequestParam(name="name")String name,
  4. @RequestParam(name="gender")String gender,//性别
  5. @RequestParam(name="age")Integer age,
  6. @RequestParam(name="password")String password

2、使用传入的参数创建userModel对象,调用userService,将userModel转成userDO对象,使用userDOMapper插入数据库

注意:此处有部分细节,需注意如使用userId查userPassword的那个表需要自定义,以及通过手机号查userInfo表也需要自定义,在最后一章我

会把库的地址贴上

2)1、使用hibernate.validator对userModel进行校验

【1】 创建存放校验信息的类ValidationResult

【2】创建一个用于校验的类ValidateImpl,提供方法返回校验信息的方法,里面包括校验的具体实现

2、密码使用md5加密存入数据库

下面是代码详情:

UserController

  1. package com.miaoshaproject.controller;
  2.  
  3. import com.alibaba.druid.util.StringUtils;
  4. import com.miaoshaproject.controller.viewobject.UserVO;
  5.  
  6. import com.miaoshaproject.error.BusinessException;
  7. import com.miaoshaproject.error.EmBusinessError;
  8. import com.miaoshaproject.response.CommonReturnType;
  9. import com.miaoshaproject.service.impl.UserServiceImpl;
  10. import com.miaoshaproject.service.model.UserModel;
  11. import org.apache.tomcat.util.security.MD5Encoder;
  12. import org.springframework.beans.BeanUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.*;
  15. import sun.misc.BASE64Encoder;
  16.  
  17. import javax.servlet.http.HttpServletRequest;
  18. import java.io.UnsupportedEncodingException;
  19. import java.security.MessageDigest;
  20. import java.security.NoSuchAlgorithmException;
  21. import java.util.Random;
  22.  
  23. @RestController
  24. @RequestMapping("/user")
  25. @CrossOrigin(allowCredentials = "true",allowedHeaders = "*")//在跨域的情况下session是不支持共享的,前端也需要设置xhrFields:{widthCredentials:true}
  26. public class UserController extends BaseController{
  27. @Autowired
  28. private UserServiceImpl userService;
  29.  
  30. @Autowired
  31. private HttpServletRequest httpServletRequest;
  32.  
  33. @RequestMapping("/getuser")
  34. @ResponseBody
  35. public CommonReturnType getUserById(@RequestParam(name="id")Integer id)throws BusinessException{
  36. UserVO userVO=new UserVO();
  37. UserModel userModel=userService.getUserById(id);
  38. if(userModel == null){
  39. throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
  40. }
  41. UserVO obj=converUserVOFromUserModel(userModel);
  42. return CommonReturnType.create(obj);
  43. }
  44.  
  45. public UserVO converUserVOFromUserModel(UserModel userModel){
  46. UserVO userVO=new UserVO();
  47. BeanUtils.copyProperties(userModel,userVO);
  48. return userVO;
  49. }
  50.  
  51. //用户获取opt短信验证码
  52. @RequestMapping(value="/getotp",method={RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
  53. @ResponseBody
  54. public CommonReturnType getOtp(@RequestParam(name="telphone")String telphone){
  55. //需要按照一定规则生成otp验证码
  56. Random random=new Random();
  57. int randomInt=random.nextInt(99999);
  58. randomInt += 10000;
  59. String otpCode=String.valueOf(randomInt);
  60. //将opt验证码同对应手机号关联,redis可用于分布式,
  61. // 这里使用httpsession的方式绑定手机号和code
  62. this.httpServletRequest.getSession().setAttribute(telphone,otpCode);
  63.  
  64. //将opt验证码通过短信通道发送给用户,
  65. // 这里省略使用控制台的方式打印code码,在企业里开发这种做法是不允许的,
  66. // 这些是敏感信息
  67. System.out.println("telphone = " + telphone + "& otpCode = " + otpCode);
  68. return CommonReturnType.create(null);
  69. }
  70. //用户登入功能
  71. @RequestMapping(value="/login",method={RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
  72. @ResponseBody
  73. public CommonReturnType login(@RequestParam(name="telphone")String telphone,
  74. @RequestParam(name="password")String password) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
  75. //入参校验
  76. if(StringUtils.isEmpty(telphone)||
  77. StringUtils.isEmpty(password)){
  78. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR);
  79. }
  80. //验证登入是否合法
  81. UserModel userModel = userService.validateLogin(telphone,
  82. this.EncodeByMd5(password));
  83. //添加登入成功的session
  84. this.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);
  85. this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userModel);
  86.  
  87. return CommonReturnType.create(null);
  88.  
  89. }
  90.  
  91. //用户注册功能
  92. @RequestMapping(value="/register",method={RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
  93. @ResponseBody
  94. public CommonReturnType register(@RequestParam(name="telphone")String telphone,
  95. @RequestParam(name="otpCode")String otpCode,
  96. @RequestParam(name="name")String name,
  97. @RequestParam(name="gender")String gender,//性别
  98. @RequestParam(name="age")Integer age,
  99. @RequestParam(name="password")String password
  100. ) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
  101. //验证手机号和对应的otpcode相符合
  102. String inSesstionOtpCode=(String)this.httpServletRequest.getSession().getAttribute(telphone);
  103. if(!com.alibaba.druid.util.StringUtils.equals(otpCode,inSesstionOtpCode)){
  104. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"短信验证码错误");
  105. }
  106.  
  107. //用户的注册流程
  108. UserModel userModel=new UserModel();
  109. userModel.setName(name);
  110. userModel.setGender(gender);
  111. userModel.setAge(age);
  112. userModel.setTelphone(telphone);
  113. userModel.setRegisterMode("byphone");
  114. userModel.setEnCrptPassword(this.EncodeByMd5(password));
  115.  
  116. userService.register(userModel);
  117.  
  118. return CommonReturnType.create(null);
  119. }
  120. //md5的加密计算
  121. //java自带的md5只支持16位
  122. public String EncodeByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  123. //确定计算方法
  124. MessageDigest md5 = MessageDigest.getInstance("MD5");
  125. BASE64Encoder base64en= new BASE64Encoder();
  126. String newStr =base64en.encode(md5.digest(str.getBytes("utf-8")));
  127. return newStr;
  128. }
  129. }

UserServiceIpml

  1. package com.miaoshaproject.service.impl;
  2.  
  3. import com.alibaba.druid.util.StringUtils;
  4. import com.miaoshaproject.dao.UserDOMapper;
  5. import com.miaoshaproject.dao.UserPasswordDOMapper;
  6. import com.miaoshaproject.dataobject.UserDO;
  7. import com.miaoshaproject.dataobject.UserPasswordDO;
  8. import com.miaoshaproject.error.BusinessException;
  9. import com.miaoshaproject.error.EmBusinessError;
  10. import com.miaoshaproject.service.UserService;
  11. import com.miaoshaproject.service.model.UserModel;
  12. import com.miaoshaproject.validator.ValidationResult;
  13.  
  14. import com.miaoshaproject.validator.ValidatorImpl;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.dao.DuplicateKeyException;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20.  
  21. @Service
  22. public class UserServiceImpl implements UserService {
  23. @Autowired
  24. private UserDOMapper userDOMapper;
  25. @Autowired
  26. private UserPasswordDOMapper userPasswordDOMapper;
  27. @Autowired
  28. private ValidatorImpl validator;
  29.  
  30. @Override
  31. public UserModel getUserById(int id) {
  32. UserDO userDO=userDOMapper.selectByPrimaryKey(id);
  33. UserPasswordDO userPasswordDO=userPasswordDOMapper.selectByUserId(id);
  34. return converFromUserDO(userDO,userPasswordDO);
  35. }
  36.  
  37. public UserModel converFromUserDO (UserDO userDO,UserPasswordDO userPasswordDO){
  38. UserModel userModel=new UserModel();
  39. if(userDO==null){
  40. return null;
  41. }
  42. BeanUtils.copyProperties(userDO,userModel);
  43. if(userPasswordDO != null){
  44. userModel.setEnCrptPassword(userPasswordDO.getEncrptPassword());
  45. }
  46. return userModel;
  47. }
  48.  
  49. @Override
  50. @Transactional
  51. public void register(UserModel userModel) throws BusinessException {
  52. //这里需要严谨一些,对所有字段判断不为空
  53. if(userModel == null){
  54. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR);
  55. }
  56. ValidationResult result=validator.validate(userModel);
  57. if(result.isHasError()){
  58. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,result.getErrMsg());
  59. }
  60.  
  61. //这里需要注意的点是在数据库里设置索引手机号是唯一的
  62. try{
  63. UserDO userDO=convertFromModel(userModel);
  64. userDOMapper.insertSelective(userDO);
  65. }catch(DuplicateKeyException ex){
  66. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"手机号已重复注册");
  67. }
  68. UserDO newUserDO=userDOMapper.selectByTelphone(userModel.getTelphone());
  69. userModel.setId(newUserDO.getId());
  70. UserPasswordDO userPasswordDO=convertPasswordFormUserModel(userModel);
  71. userPasswordDOMapper.insertSelective(userPasswordDO);
  72. return;
  73. }
  74. private UserPasswordDO convertPasswordFormUserModel(UserModel userModel){
  75. if(userModel==null){
  76. return null;
  77. }
  78. UserPasswordDO userPasswordDO=new UserPasswordDO();
  79. userPasswordDO.setEncrptPassword(userModel.getEnCrptPassword());
  80.  
  81. userPasswordDO.setUserId(userModel.getId());
  82. return userPasswordDO;
  83. }
  84. private UserDO convertFromModel(UserModel userModel){
  85. if(userModel == null){
  86. return null;
  87. }
  88. UserDO userDO = new UserDO();
  89. BeanUtils.copyProperties(userModel,userDO);
  90. return userDO;
  91. }
  92.  
  93. //登入是否合法
  94.  
  95. @Override
  96. public UserModel validateLogin(String telphone, String password) throws BusinessException {
  97. //通过手机获取用户信息,新增查询方式通过手机来获取用户信息
  98. UserDO userDO=userDOMapper.selectByTelphone(telphone);
  99. if(userDO==null){
  100. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"用户不存在");
  101. }
  102. UserPasswordDO userPasswordDO=userPasswordDOMapper.selectByUserId( userDO.getId());
  103.  
  104. //比对用户信息内加密的密码是否和传输进来的一致
  105. if(!StringUtils.equals(userPasswordDO.getEncrptPassword(),password)){
  106. throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"账号或密码不存在");
  107. }
  108. UserModel userModel=converFromUserDO(userDO,userPasswordDO);
  109. return userModel;
  110. }
  111. }

ValidationResult

  1. package com.miaoshaproject.validator;
  2.  
  3. import org.springframework.beans.factory.InitializingBean;
  4. import org.springframework.stereotype.Component;
  5.  
  6. import javax.validation.ConstraintViolation;
  7. import javax.validation.Validation;
  8. import javax.validation.Validator;
  9. import java.util.Set;
  10.  
  11. @Component
  12. public class ValidatorImpl implements InitializingBean {
  13. //javax.validator
  14. private Validator validator;
  15.  
  16. @Override
  17. public void afterPropertiesSet() throws Exception {
  18. //将hibernate validator通过工厂的初始化方式使其实例化
  19. this.validator = Validation.buildDefaultValidatorFactory().getValidator();
  20.  
  21. }
  22.  
  23. //事项校验方法返回校验结果
  24. public ValidationResult validate(Object bean){
  25. ValidationResult result=new ValidationResult();
  26. Set<ConstraintViolation<Object>> constraintViolationsSet=validator.validate(bean);
  27. if(constraintViolationsSet.size()>0){
  28. //有错误
  29. result.setHasError(true);
  30. /*这里有报错说不支持7及以下的语言等级,
  31. * file->project strcture->module->选择resource上面的language level给为7以上的
  32. * file->setting->compiler->java Compiler->将version改为7以上
  33. * */
  34. constraintViolationsSet.forEach(constraintViolation->{
  35. String errMsg=constraintViolation.getMessage();
  36. String propertyName=constraintViolation.getPropertyPath().toString();
  37. result.getErrMsgMap().put(propertyName,errMsg);
  38. });
  39. }
  40. return result;
  41. }
  42. }

ValidateImpl

  1. package com.miaoshaproject.validator;
  2.  
  3. import org.springframework.beans.factory.InitializingBean;
  4. import org.springframework.stereotype.Component;
  5.  
  6. import javax.validation.ConstraintViolation;
  7. import javax.validation.Validation;
  8. import javax.validation.Validator;
  9. import java.util.Set;
  10.  
  11. @Component
  12. public class ValidatorImpl implements InitializingBean {
  13. //javax.validator
  14. private Validator validator;
  15.  
  16. @Override
  17. public void afterPropertiesSet() throws Exception {
  18. //将hibernate validator通过工厂的初始化方式使其实例化
  19. this.validator = Validation.buildDefaultValidatorFactory().getValidator();
  20.  
  21. }
  22.  
  23. //事项校验方法返回校验结果
  24. public ValidationResult validate(Object bean){
  25. ValidationResult result=new ValidationResult();
  26. Set<ConstraintViolation<Object>> constraintViolationsSet=validator.validate(bean);
  27. if(constraintViolationsSet.size()>0){
  28. //有错误
  29. result.setHasError(true);
  30. /*这里有报错说不支持7及以下的语言等级,
  31. * file->project strcture->module->选择resource上面的language level给为7以上的
  32. * file->setting->compiler->java Compiler->将version改为7以上
  33. * */
  34. constraintViolationsSet.forEach(constraintViolation->{
  35. String errMsg=constraintViolation.getMessage();
  36. String propertyName=constraintViolation.getPropertyPath().toString();
  37. result.getErrMsgMap().put(propertyName,errMsg);
  38. });
  39. }
  40. return result;
  41. }
  42. }

springboot秒杀课程学习整理1-3的更多相关文章

  1. springboot秒杀课程学习整理1-6

    1)活动模型设计 配饰秒杀的模型(promoModel)id promoName startDate(建议使用joda-time) endDate itemId promoItemPrice 数据库( ...

  2. springboot秒杀课程学习整理1-1

    1)新建一个maven工程quickStart,然后在pom文件里添加依赖 <parent> <groupId>org.springframework.boot</gro ...

  3. springboot秒杀课程学习整理1-5

    1)交易模型设计 交易模型(用户下单的交易模型)OrderModel id(String 交易单号使用String), userId,itemId,amount(数量),orderAmount(总金额 ...

  4. springboot秒杀课程学习整理1-4

    1)商品模型设计 (应该是先设计商品的model,然后才是数据库表) 模型字段(id,title,price(double),stock(库存),description,sales,imgUrl) 创 ...

  5. springboot秒杀课程学习整理1-2

    1)从数据库到前端,做了三层转换,最后统一返回给前端的格式 DO-> model: 放在service中,目的是为了组装来自于数据库的数据,有些字段来自于不同的表的取,这一层相当于真正的业务模型 ...

  6. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  7. 201671010450-姚玉婷-实验十四 团队项目评审&课程学习总结

    项目 内容 所属科目 软件工程http://www.cnblogs.com/nwnu-daizh 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11093584. ...

  8. 金生芳-实验十四 团队项目评审&课程学习总结

    实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课 ...

  9. 201671030117 孙欢灵 实验十四 团队项目评审&课程学习总结

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...

随机推荐

  1. 【视频合集】极客时间 react实战进阶45讲 【更新中】

    https://up2.v.sharedaka.com/video/ochvq0AVfpa71A24bmugS5EewhFM1553702519936.mp4 01 React出现的历史背景及特性介绍 ...

  2. Openssl 升级操作

    转自:http://www.cnblogs.com/lzcys8868/p/9235538.html 首先我觉得没事就用绿盟扫漏洞的公司,就是闲的蛋疼,傻逼!不少服务器使用nginx,如果openss ...

  3. hadoop过程中遇到的错误与解决方法

    本文整理了在hadoop学习过程中遇到的各种问题. windows下开发环境搭建 大部分情况下,我们都是在windows下开发,hadoop则一般部署于linux服务器(无论是CDH还是原生hadoo ...

  4. CMT302 Coursework Assessment Pro-forma

    Cardiff School of Computer Science and Informa5csCoursework Assessment Pro-formaModule Code: CMT302 ...

  5. Centos7通过SSH使用密钥实现免密登录

    日常开发中,难免会有登录服务器的操作,而通过ssh方式登录无疑是比较方便的一种方式. 如果登录较频繁,使用密钥实现免密登录无疑更是方便中的方便.因此本文就简单说一说如何实现免密登录. 一.安装配置ss ...

  6. bootstrap 简单练习(后续把其它页面也进行练习)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. 给COCO数据集的json标签换行

    #include <iostream> #include <fstream> #include <string> #include <vector> u ...

  8. html2canvas文字重叠(手机端)

    发现情况: 1.设置文字居中,文字自动换行后文字有重叠   text-align: center; 解决办法: text-align: left; text-align: justify;等 2.使用 ...

  9. bzoj2054疯狂的馒头——线段树

    中文题面,一排有n个馒头,用刷子把整个连续的区间刷成一种颜色.因为颜色会覆盖掉之前的.所以我们可以用线段树来反着处理.如果这段区间之前刷到过就不要再遍历进去了,因为这次已经被上次刷的颜色给覆盖了.最后 ...

  10. 动态 DP 学习笔记

    不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...