• 【学生管理系统】用户登录三种验证方式—图片验证、短信验证、邮件验证


    目录

    一、页面需求展示

    二、验证方式—按钮组件

    三、手机短信验证

    四、邮件验证

    五、图片验证邮件验证

    💟 创作不易,不妨点赞💚评论❤️收藏💙一下


    一、页面需求展示


    二、验证方式—按钮组件

     2.1前端

    1. <el-form-item label="验证方式">
    2. <el-button type="primary" icon="el-icon-phone" circle @click.prevent="verModeFn(1)">el-button>
    3. <el-button type="success" icon="el-icon-message" circle @click.prevent="verModeFn(2)">el-button>
    4. <el-button type="warning" icon="el-icon-camera" circle @click.prevent="verModeFn(3)">el-button>
    5. el-form-item>
    6. <el-form-item v-if="verMode == 1" label="手机号" prop="telephone">
    7. el-form-item>
    8. <el-form-item v-if="verMode == 1" label="短信验证">
    9. el-form-item>
    10. <el-form-item v-if="verMode == 2" label="邮箱" prop="email">
    11. el-form-item>
    12. <el-form-item v-if="verMode == 2" label="邮件验证">
    13. el-form-item>
    14. <el-form-item v-if="verMode == 3" label="图片验证">
    15. el-form-item>
    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. verMode : '3' , //验证方式
    6. }
    7. },
    8. methods:{
    9. //验证方式点击方法
    10. verModeFn(vo){
    11. this.verMode = vo
    12. },
    13. }
    14. script>

    三、手机短信验证

    3.1 前端

    1. <el-form-item v-if="verMode == 1" label="手机号" prop="telephone">
    2. <el-row>
    3. <el-col :span="13">
    4. <el-input v-model="user.telephone">el-input>
    5. el-col>
    6. <el-col :span="11">
    7. <el-button type="success" style="margin-left: 5px;padding: 10px 6px"
    8. @click.prevent="sendSmsCodeFn"
    9. :disabled="btnDisabled"
    10. >短信发送{{seconds}}秒el-button>
    11. el-col>
    12. el-row>
    13. el-form-item>
    14. <el-form-item v-if="verMode == 1" label="短信验证">
    15. <el-row>
    16. <el-col :span="13">
    17. <el-input v-model="user.codeSms">el-input>
    18. el-col>
    19. <el-col :spam="11">
    20. <span style="color:red">{{errorMsg.message}}span>
    21. el-col>
    22. el-row>
    23. el-form-item>
    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. user:{
    6. userName:'',
    7. password:'',
    8. telephone:'', //手机号
    9. },
    10. errorMsg: {},
    11. verMode : '3' , //验证方式
    12. btnDisabled : false , //倒计时控制变量,可用不可用
    13. seconds: 10 , //默认倒计时秒数
    14. timer : null , //接收定时器,清除定时器
    15. },
    16. methods:{
    17. //验证方式点击方法
    18. verModeFn(vo){
    19. this.verMode = vo
    20. },
    21. //发送短信验证--
    22. async sendSmsCodeFn(){
    23. let {data:baseResult} = await this.$axios.post(`/user-service/sms/code`,this.user);
    24. this.errorMsg = baseResult ;
    25. //按钮不可用
    26. this.btnDisabled = true ;
    27. //倒计时
    28. this.timer = setInterval(() => {
    29. if(this.seconds <= 1){
    30. //结束,重置秒数
    31. this.seconds = 10 ;
    32. this.btnDisabled = false ;
    33. //停止定时器
    34. clearInterval(this.timer);
    35. }else{
    36. this.seconds-- ;
    37. }
    38. }, 1000);
    39. },
    40. }
    41. script>

    3.2后端

     生成短信验证码,保存在redis中

    1. @RestController
    2. @RequestMapping("/sms")
    3. public class SmsController {
    4. @Resource
    5. private StringRedisTemplate stringRedisTemplate ;
    6. @PostMapping("/code")
    7. public BaseResult sendSms(@RequestBody TbUser user){
    8. //获取当前毫秒值
    9. long start = System.currentTimeMillis();
    10. try {
    11. //发送短信
    12. //1.生成验证码,随机4位数
    13. String code = RandomStringUtils.randomNumeric(4);
    14. System.out.println("短信验证码:" + code);
    15. //存放在redis中
    16. stringRedisTemplate.opsForValue().set("smsPhone"+user.getTelephone(),code,1, TimeUnit.HOURS);
    17. //发送短信
    18. SendSmsResponse smsResponse = SmsUtil.sendSms(user.getTelephone(), user.getUserName(), code, "", "");
    19. if ("OK".equalsIgnoreCase(smsResponse.getCode())){
    20. return BaseResult.ok("短信发送成功,请查收!");
    21. }else {
    22. return BaseResult.error(smsResponse.getMessage());
    23. }
    24. } catch (ClientException e) {
    25. //获取结束时间毫秒值
    26. long end = System.currentTimeMillis();
    27. System.out.println(end -start);
    28. return BaseResult.error("短信发送失败!");
    29. }
    30. }
    31. }

    点击登录进行短信验证码判断是否正确

    1. @RestController
    2. @RequestMapping("/user")
    3. public class UserController {
    4. @Resource
    5. private UserService userService ;
    6. @Resource
    7. private JwtProperties jwtProperties ;
    8. @Resource
    9. private StringRedisTemplate stringRedisTemplate ;
    10. @PostMapping("/login")
    11. public BaseResult login(@RequestBody TbUser user) throws Exception {
    12. //手机短信验证
    13. if (user.getCodeSms() != null) {
    14. //获取短信验证码
    15. String sms = "smsPhone" + user.getTelephone() ;
    16. String keySms = stringRedisTemplate.opsForValue().get(sms);
    17. stringRedisTemplate.delete(keySms);
    18. if (keySms == null ){
    19. return BaseResult.error("短信验证码无效!");
    20. }
    21. if (!keySms.equalsIgnoreCase(user.getCodeSms())){
    22. return BaseResult.error("短信验证码错误!");
    23. }
    24. }
    25. //登录对用户名和密码进行判断
    26. //调用userService接口中的方法login进行实现类编写,判断用户名和密码是否正确
    27. TbUser findUser = userService.login(user);
    28. if (findUser != null){
    29. //设置token
    30. String token = JwtUtils.generateToken(findUser, jwtProperties.getExpire(), jwtProperties.getPrivateKey());
    31. return BaseResult.ok("登录成功,欢迎"+findUser.getUserName(),findUser).append("token",token);
    32. }else {
    33. return BaseResult.error("用户名或密码不正确!");
    34. }
    35. }
    36. }

    四、邮件验证

    4.1 前端

    1. <el-form-item v-if="verMode == 2" label="邮箱" prop="email">
    2. <el-row>
    3. <el-col :span="13">
    4. <el-input v-model="user.email">el-input>
    5. el-col>
    6. <el-col :span="11">
    7. <el-button type="success" style="margin-left: 5px;padding: 10px 6px"
    8. @click.prevent="emailCodeFn"
    9. :disabled="btnDisabled"
    10. >邮件发送{{seconds}}秒el-button>
    11. el-col>
    12. el-row>
    13. el-form-item>
    14. <el-form-item v-if="verMode == 2" label="邮件验证">
    15. <el-row>
    16. <el-col :span="13">
    17. <el-input v-model="user.emailCode">el-input>
    18. el-col>
    19. <el-col :spam="11">
    20. <span style="color:red">{{errorMsg.message}}span>
    21. el-col>
    22. el-row>
    23. el-form-item>
    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. user:{
    6. userName:'',
    7. password:'',
    8. email : ''
    9. },
    10. errorMsg: {},
    11. verMode : '3' , //验证方式
    12. btnDisabled : false , //倒计时控制变量,可用不可用
    13. seconds: 10 , //默认倒计时秒数
    14. timer : null , //接收定时器,清除定时器
    15. },
    16. methods:{
    17. //验证方式点击方法
    18. verModeFn(vo){
    19. this.verMode = vo
    20. },
    21. //发送邮箱验证
    22. async emailCodeFn(){
    23. let {data:baseResult} = await this.$axios.post(`/user-service/email/send`,this.user);
    24. this.errorMsg = baseResult ;
    25. if(baseResult.code == 20000){
    26. this.btnDisabled = true ;
    27. this.timer = setInterval(() => {
    28. if(this.seconds <= 1){
    29. this.seconds = 10 ;
    30. this.btnDisabled = false ;
    31. clearInterval(this.timer);
    32. }else {
    33. this.seconds-- ;
    34. }
    35. }, 1000);
    36. }
    37. }
    38. }
    39. script>

    4.2后端

      生成短信验证码,保存在redis中

    1. @RestController
    2. @RequestMapping("/email")
    3. public class EmailController {
    4. @Resource
    5. private StringRedisTemplate stringRedisTemplate ;
    6. @Resource
    7. private JavaMailSender javaMailSender ;
    8. @PostMapping("/send")
    9. public BaseResult send(@RequestBody TbUser tbUser){
    10. try {
    11. //随机生成验证码
    12. String code = RandomStringUtils.randomNumeric(4);
    13. System.out.println("邮件验证码:"+code);
    14. //保存到redis
    15. String key = "email"+tbUser.getUserName();
    16. stringRedisTemplate.opsForValue().set(key,code,1, TimeUnit.HOURS);
    17. //发送
    18. EmailUtils.sendEmail(javaMailSender,tbUser.getEmail(),"邮件验证码为:"+code);
    19. //返回
    20. return BaseResult.ok("邮件发送成功!");
    21. } catch (Exception e) {
    22. e.getMessage();
    23. return BaseResult.error("发送邮件失败!");
    24. }
    25. }
    26. }

    点击登录进行邮件验证码判断是否正确

    1. @RestController
    2. @RequestMapping("/user")
    3. public class UserController {
    4. @Resource
    5. private UserService userService ;
    6. @Resource
    7. private JwtProperties jwtProperties ;
    8. @Resource
    9. private StringRedisTemplate stringRedisTemplate ;
    10. @PostMapping("/login")
    11. public BaseResult login(@RequestBody TbUser user) throws Exception {
    12. //邮箱验证
    13. if (user.getEmailCode() != null){
    14. //获取邮箱验证码
    15. String keyEmail = "email"+user.getUserName();
    16. String redisEmail = stringRedisTemplate.opsForValue().get(keyEmail);
    17. stringRedisTemplate.delete(keyEmail);
    18. if (redisEmail == null){
    19. return BaseResult.error("email验证码无效!");
    20. }
    21. if (!redisEmail.equalsIgnoreCase(user.getEmailCode())){
    22. return BaseResult.error("email验证码错误!");
    23. }
    24. }
    25. //登录对用户名和密码进行判断
    26. //调用userService接口中的方法login进行实现类编写,判断用户名和密码是否正确
    27. TbUser findUser = userService.login(user);
    28. if (findUser != null){
    29. //设置token
    30. String token = JwtUtils.generateToken(findUser, jwtProperties.getExpire(), jwtProperties.getPrivateKey());
    31. return BaseResult.ok("登录成功,欢迎"+findUser.getUserName(),findUser).append("token",token);
    32. }else {
    33. return BaseResult.error("用户名或密码不正确!");
    34. }
    35. }
    36. }

    五、图片验证邮件验证

    5.1 前端

    1. <el-form-item v-if="verMode == 3" label="图片验证">
    2. <el-row>
    3. <el-col :span="11">
    4. <el-input v-model="user.verifyCode">el-input>
    5. el-col>
    6. <el-col :span="13" >
    7. <img :src="imgSrc" v-if="user.userName != ''"
    8. style="width: 90px;height: 39px;padding-left: 4px"
    9. @click.prevent="changeVerifyCode"
    10. />
    11. <span>看不清?<a href="" @click.prevent="changeVerifyCode">换一张a>span>
    12. el-col>
    13. el-row>
    14. <span style="color:red">{{errorMsg.message}}span>
    15. el-form-item>
    16. <el-form-item>
    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. user:{
    6. userName:'',
    7. password:'',
    8. verifyCode:'', //图片验证码
    9. },
    10. imgSrc: '', //绑定图片
    11. errorMsg: {},
    12. verMode : '3' , //验证方式
    13. },
    14. methods:{
    15. //验证方式点击方法
    16. verModeFn(vo){
    17. this.verMode = vo
    18. },
    19. //图片验证码
    20. changeVerifyCode(){
    21. if(this.user.userName){
    22. //使用时间对验证码进行标识
    23. //与用户名进行绑定,只要用户名失去焦点就对图片验证码进行一个更新
    24. this.imgSrc = `http://localhost:10010/user-service/verifycode?userName=${this.user.userName}&t=${new Date().getTime()}`
    25. }else{
    26. this.errorMsg.message = '用户不能为空';
    27. }
    28. },
    29. }
    30. script>

    5.2后端

     生成图片验证码,保存在redis中

    1. @Controller
    2. @RequestMapping("/verifycode")
    3. public class VerifyCodeController {
    4. @Resource
    5. private StringRedisTemplate stringRedisTemplate ;
    6. @GetMapping
    7. public void verifyCodeFn(String userName,HttpServletResponse response) throws Exception {
    8. //准备数据
    9. //字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
    10. String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    11. int IMG_WIDTH = 72;
    12. int IMG_HEIGTH = 27;
    13. Random random = new Random();
    14. //创建图片
    15. BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGTH, BufferedImage.TYPE_INT_RGB);
    16. //画板
    17. Graphics g = image.getGraphics();
    18. //填充背景
    19. g.setColor(Color.WHITE);
    20. g.fillRect(1,1,IMG_WIDTH-2,IMG_HEIGTH-2);
    21. g.setFont(new Font("楷体", Font.BOLD,25));
    22. StringBuilder sb = new StringBuilder();
    23. //写字
    24. for(int i = 1 ; i <= 4 ; i ++){
    25. //随机颜色
    26. g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
    27. int len = random.nextInt(VERIFY_CODES.length());
    28. String str = VERIFY_CODES.substring(len,len+1);
    29. sb.append(str);
    30. g.drawString(str, IMG_WIDTH / 6 * i , 22 );
    31. }
    32. //将验证码存放到redis
    33. //设置名称login+username ,过期时间1小时
    34. stringRedisTemplate.opsForValue().set( "login" + userName , sb.toString() , 1 , TimeUnit.HOURS);
    35. // 生成随机干扰线
    36. for (int i = 0; i < 30; i++) {
    37. //随机颜色
    38. g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
    39. int x = random.nextInt(IMG_WIDTH - 1);
    40. int y = random.nextInt(IMG_HEIGTH - 1);
    41. int x1 = random.nextInt(12) + 1;
    42. int y1 = random.nextInt(6) + 1;
    43. g.drawLine(x, y, x - x1, y - y1);
    44. }
    45. //响应到浏览器
    46. ImageIO.write(image,"jpeg", response.getOutputStream());
    47. }
    48. }

    点击登录进行图片验证码判断是否正确

    1. @RestController
    2. @RequestMapping("/user")
    3. public class UserController {
    4. @Resource
    5. private UserService userService ;
    6. @Resource
    7. private JwtProperties jwtProperties ;
    8. @Resource
    9. private StringRedisTemplate stringRedisTemplate ;
    10. @PostMapping("/login")
    11. public BaseResult login(@RequestBody TbUser user) throws Exception {
    12. //校验图片验证码
    13. if (!user.getVerifyCode().equals("")) {
    14. //获取验证码
    15. String key = "login" + user.getUserName() ;
    16. String verify = stringRedisTemplate.opsForValue().get(key);
    17. //删除验证码
    18. stringRedisTemplate.delete(key);
    19. if (verify == null) {
    20. return BaseResult.error("图片验证码无效!");
    21. }
    22. if (!verify.equalsIgnoreCase(user.getVerifyCode())) {
    23. return BaseResult.error("图片验证码错误!");
    24. }
    25. }
    26. //登录对用户名和密码进行判断
    27. //调用userService接口中的方法login进行实现类编写,判断用户名和密码是否正确
    28. TbUser findUser = userService.login(user);
    29. if (findUser != null){
    30. //设置token
    31. String token = JwtUtils.generateToken(findUser, jwtProperties.getExpire(), jwtProperties.getPrivateKey());
    32. return BaseResult.ok("登录成功,欢迎"+findUser.getUserName(),findUser).append("token",token);
    33. }else {
    34. return BaseResult.error("用户名或密码不正确!");
    35. }
    36. }
    37. }

    写到最后

    四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!

    🐋 你的支持认可是我创作的动力

    💟 创作不易,不妨点赞💚评论❤️收藏💙一下

    😘 感谢大佬们的支持,欢迎各位前来不吝赐教

  • 相关阅读:
    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持
    服务器租用机房机房的类型应该如何选择
    英语句式参考纯享版 - 定语从句
    asp毕业设计—— 基于asp+access的网上动态同学录系统设计与实现(毕业论文+程序源码)——同学录系统
    maven项目如何打包运行指定java程序(maven-shade-plugin插件的使用)
    【MQTT】Javascript通过WebSocket连接MQTT
    基于MxNet实现目标检测-YoloV4【附部分源码及模型】
    Element Plus 组件库相关技术:7. 组件实现的基本流程及 Icon 组件的实现
    云上未来:探索云计算的技术变革与应用趋势
    【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】神经元和人工神经网络
  • 原文地址:https://blog.csdn.net/zsy3757486/article/details/127701189