移动端开发_手机快速登录
文章目录
- 移动端开发_手机快速登录
- 第一章. 需求分析
- 第二章. 手机快速登录
- 【路径】
- 2.1. 前台代码
- 2.1.1. 发送验证码
- 2.1.2. 提交登录请求
- 2.2. 后台代码
- 2.2.1. Controller
- 2.2.2. 服务接口
- 2.2.3. 服务实现类
- 2.2.4. Dao接口
- 2.2.5. Mapper映射文件
移动端开发_手机快速登录
第一章. 需求分析
手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完成登录,是目前比较流行的登录方式。
第二章. 手机快速登录
【路径】
(1)发送验证码
- 获得用户输入的手机号码
- 生成动态验证码(4或者6位)
- 使用阿里云发送短信验证码
- 把验证码存到redis(存5分钟)
(2)登录 - 获得用户输入的信息(Map)
- 取出redis里面的验证码和用户输入的验证码进行校验
- 如果校验通过
• 判断是否是会员, 不是会员, 自动注册为会员
• 保存用户的登录状态( CAS(Central Authentication Service)或者自己手动签发token ,我们这里可以使用Cookie存储用户信息)
2.1. 前台代码
登录页面为/pages/login.html
2.1.1. 发送验证码
(1)为获取验证码按钮绑定事件,并在事件对应的处理函数中校验手机号,如果手机号输入正确则显示30秒倒计时效果并发送ajax请求,发送短信验证码
<div class="input-row"><label>手机号</label><div class="loginInput"><input v-model="loginInfo.telephone" id='account' type="text" placeholder="请输入手机号"><input id="validateCodeButton" @click="sendValidateCode()" type="button" style="font-size: 12px" value="获取验证码"></div>
</div>
(2)调用sendValidateCode()方法
//发送验证码
sendValidateCode(){var telephone = this.loginInfo.telephone;if (!checkTelephone(telephone)) {this.$message.error('请输入正确的手机号');return false;}validateCodeButton = $("#validateCodeButton")[0];clock = window.setInterval(doLoop, 1000); //一秒执行一次axios.post("/validateCode/send4Login.do?telephone=" + telephone).then((response) => {if(!response.data.flag){//验证码发送失败this.$message.error('验证码发送失败,请检查手机号输入是否正确');}});
},
(3)在 ValidateCodeController 中提供 send4Login方法,调用短信服务发送验证码并将验证码保存到redis
注意:存放到redis的可以值:手机号+002(RedisMessageConstant.SENDTYPE_LOGIN)
package com.atguigu.controller;import com.atguigu.constant.MessageConstant;
import com.atguigu.constant.RedisConstant;
import com.atguigu.constant.RedisMessageConstant;
import com.atguigu.entity.Result;
import com.atguigu.utils.SMSUtils;
import com.atguigu.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;@RestController
@RequestMapping("/validateCode")
public class ValidateCodeController {@Autowiredprivate JedisPool jedisPool;//手机快速登录时发送手机验证码@RequestMapping("/send4Login")public Result send4Login(String telephone){Integer code = ValidateCodeUtils.generateValidateCode(4);//生成4位数字验证码try {//发送短信SMSUtils.sendShortMessage(telephone,code.toString());} catch (ClientException e) {e.printStackTrace();//验证码发送失败return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);}System.out.println("发送的手机验证码为:" + code);//将生成的验证码缓存到redisjedisPool.getResource().setex(telephone+RedisMessageConstant.SENDTYPE_LOGIN,5 * 60,code.toString());//验证码发送成功return new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);}
2.1.2. 提交登录请求
(1)为登录按钮绑定事件
<div class="btn yes-btn"><a @click="login()" href="#">登录</a></div>
(2)点击登录,login方法:
//登录
login(){var telephone = this.loginInfo.telephone;if (!checkTelephone(telephone)) {this.$message.error('请输入正确的手机号');return false;}axios.post("/login/check.do",this.loginInfo).then((response) => {if(response.data.flag){//登录成功,跳转到index.htmlwindow.location.href="index.html";}else{//失败,提示失败信息this.$message.error(response.data.message);}});
}
2.2. 后台代码
2.2.1. Controller
在meinian_mobile_web工程中创建LoginController并提供check方法进行登录检查,处理逻辑为:
【路径】
1、校验用户输入的短信验证码是否正确,如果验证码错误则登录失败
2、如果验证码正确,则判断当前用户是否为会员,如果不是会员则自动完成会员注册
3、向客户端写入Cookie,内容为用户手机号
package com.atguigu.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.constant.MessageConstant;
import com.atguigu.constant.RedisMessageConstant;
import com.atguigu.entity.Result;
import com.atguigu.pojo.Member;
import com.atguigu.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;/*** 用户登录*/
@RestController
@RequestMapping("/login")
public class LoginController {@Referenceprivate MemberService memberService;@Autowiredprivate JedisPool jedisPool;//使用手机号和验证码登录@RequestMapping("/check")public Result check(HttpServletResponse response, @RequestBody Map map){String telephone = (String) map.get("telephone");String validateCode = (String) map.get("validateCode");//1:从Redis中获取缓存的验证码,判断验证码输入是否正确String codeInRedis = jedisPool.getResource().get(telephone + RedisMessageConstant.SENDTYPE_LOGIN);if(codeInRedis == null || !codeInRedis.equals(validateCode)){//验证码输入错误return new Result(false, MessageConstant.VALIDATECODE_ERROR);}else{//验证码输入正确//2:判断当前用户是否为会员Member member = memberService.findByTelephone(telephone);if(member == null){//当前用户不是会员,自动完成注册member = new Member();member.setPhoneNumber(telephone);member.setRegTime(new Date());memberService.add(member);}//3::登录成功//写入Cookie,跟踪用户Cookie cookie = new Cookie("login_member_telephone",telephone);cookie.setPath("/");//路径cookie.setMaxAge(60*60*24*30);//有效期30天(单位秒)response.addCookie(cookie);return new Result(true,MessageConstant.LOGIN_SUCCESS);}}
}
2.2.2. 服务接口
在MemberService服务接口中提供findByTelephone和add方法
package com.atguigu.service;
import com.atguigu.pojo.Member;
public interface MemberService {Member findByTelephone(String telephone);void add(Member member);
}
2.2.3. 服务实现类
在 MemberServiceImpl 服务实现类中实现 findByTelephone 和 add 方法
【路径】
1:使用手机号查询会员
2:新增会员
package com.atguigu.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.dao.MemberDao;
import com.atguigu.pojo.Member;
import com.atguigu.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;@Service(interfaceClass = MemberService.class)
@Transactional
public class MemberServiceImpl implements MemberService {@Autowiredprivate MemberDao memberDao;public Member findByTelephone(String telephone) {return memberDao.findByTelephone(telephone);}public void add(Member member) {if(member.getPassword() != null){member.setPassword(MD5Utils.md5(member.getPassword()));}memberDao.add(member);}
}
导入MD5Utils.java
2.2.4. Dao接口
在 MemberDao接口中声明findByTelephone和add方法
public void add(Member member);
public Member findByTelephone(String telephone);
2.2.5. Mapper映射文件
在 MemberDao.xml 映射文件中定义SQL语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.dao.MemberDao"><!--新增会员--><insert id="add" parameterType="member"><selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">SELECT LAST_INSERT_ID()</selectKey>insert into t_member(fileNumber,name,sex,idCard,phoneNumber,regTime,password,email,birthday,remark)values(#{fileNumber},#{name},#{sex},#{idCard},#{phoneNumber},#{regTime},#{password},#{email},#{birthday},#{remark})</insert><!--根据手机号查询会员--><select id="findByTelephone" parameterType="string" resultType="member">select * from t_member where phoneNumber = #{phoneNumber}</select>
</mapper>
登录:http://localhost/pages/login.html
登录成功之后可以查看浏览器Cookie是否写入成功。
登录成功
移动端开发_手机快速登录相关推荐
- 传智健康_第9章 移动端开发-手机快速登录、权限控制
传智健康_第9章 移动端开发-手机快速登录.权限控制 文章目录 传智健康_第9章 移动端开发-手机快速登录.权限控制 1. 需求分析 2. 手机快速登录 2.1 页面调整 2.1.1 发送验证码 2. ...
- 学习【瑞吉外卖⑥】SpringBoot单体项目_手机验证码登录业务开发
视频:[黑马程序员]Java 项目实战<瑞吉外卖>,轻松掌握 SpringBoot + MybatisPlus 开发核心技术 资料:2022 最新版 Java学习 路线图>第 5 阶 ...
- java 微博不出现授权_新浪微博快速登录,为什么出现了授权页面,点击授权但是却没有获取用户信息呢?...
从别人那里接手一个H5的项目,项目主要使用 gulp (nodejs),基于 zepto , canjs 做为主要框架, 进行路由.模板渲染和数据绑定, reqiuriejs 作为 js 加载器. 在 ...
- .net移动端开发_移动端开发1(前端一)
Day14 1.视口:浏览器显示内容的屏幕区域 < meta name="viewport"//视图标签 content="width"//设备宽度 in ...
- java移动端开发_移动端开发
1.移动端视口问题 视口是指浏览器的可视区域,移动端的视口到底是多宽呢? 现在市面上的大部分手机,比如iphone X,它的默认视口宽度为980px,而一个iphone X的屏幕宽度仅仅为375px. ...
- Revit二次开发_轴网快速标注
通过Revit二次开发实现对平行轴网的快速标注.交互操作是框选轴网->点选尺寸标注出现的位置->生成两道尺寸标注. 要达到设想的结果一些地方需要特殊考虑: 框选操作容易误选轴网,起码要把与 ...
- 美年_移动端开发_权限控制_Spring Security入门与进阶
文章目录 第三章权限控制 3.1. 认证和授权概念 3.2. 权限模块数据模型 3.3 RBAC权限模型扩展: [小结] 3.3. Spring Security简介 [讲解] [小结] 3.4. S ...
- Linux开发_反编译开发_破解简单登录程序外加缓冲区溢出攻击
缓冲区溢出攻击即破坏指定buff的缓冲区大小,使其溢出到别的空间上去,破坏堆栈. 比如有如下代码: #include <stdio.h> #include <string.h> ...
- 阅文java服务端开发_阅文笔试复盘
本文记录2020-05-19的阅文Java方向笔试复盘,有些题目不是很记得了,把自己记得的写一下吧. 单选题 多播的IP地址是哪一类? 说实话这个题一开始我也懵逼,虽然自己有点记忆但是不是很敢选,后来 ...
最新文章
- Balanced Binary Tree leetcode java
- xampp访问php显示空白,运行PHP项目显示空白
- 【Spring注解】@Condition条件注册
- 删除 多个表_合并汇总多个工作簿多个工作表,删除修改新增更新内容只需刷新...
- php implicit_flush,php – ob_implicit_flush(),flush(),ob_flush() – 不在远程服务器上工作...
- 《System语言详解》——5. 语言元素
- 计算机网络-3-局域网数据链路层原理与技术
- 基于数据挖掘技术的客户关系管理系统设计与实现
- 第三方平台可以通过微信公众平台素材管理接口实现同步了
- Lattice FPGA 使用指南4 - 全局复位网络GSR的使用
- 5855. 找出数组中的第 K 大整数
- autoit入门小教程_入门介绍
- Mac删除OBS的虚拟摄像头
- 游戏2:HTML5制作网页游戏看看你有多色--createjs
- 用Excel地图可视化——2017世界各国和地区GDP排名(初步统计版)
- linux log4cxx 静态库,log4cxx的个人实践
- Linux芯片级移植与底层驱动(基于3.7.4内核) --SMP多核启动以及CPU热插拔驱动
- ajax的响应与取消响应
- SpringBoot搭建微信公众号后台(一):消息接收与响应
- 【离散数学】第一章 —— 基础:逻辑和证明
热门文章
- Django做一个简单的博客系统(14)----增加文章标签
- 笔记本计算机怎么调出来,笔记本电脑如何恢复出厂设置【方法介绍】
- 关注流动儿童心理健康,这场亲子营游学活动很“有爱”
- PlantSimulation中4中移动对象的方法对比
- html的网页效果不一样,新人问:html中不同尺寸的显示器,显示的效果不一样,怎么解决?_html/css_WEB-ITnose...
- 医疗机器人在AI领域的广泛应用
- 云计算与大数据-虚拟化与容器技术题库
- oracle中的数据类型
- 结构体初始化的几种方式
- 计算机表格定义,怎么进行报表定义