一、数据库设计

CREATE TABLE `miaosha_user` (
`id` bigint(20) NOT NULL COMMENT '用户ID,手机号码',
`nickname` varchar(255) NOT NULL,
`password` varchar(32) DEFAULT NULL COMMENT 'MD5(MD5(pass明文+固定salt) salt)',
`salt` varchar(10) DEFAULT NULL,
`head` varchar(128) DEFAULT NULL COMMENT '头像,云存储的ID',
`register_date` datetime DEFAULT NULL COMMENT '注册时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上登录时间',
`login_count` int(11) DEFAULT '' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='秒杀用户表'; SET FOREIGN_KEY_CHECKS = 1;

二、明文密码两次MD5处理

1、用户端:pass = MD5(明文+固定salt)

2、服务端:pass = MD5(用户输入+随机salt)

第一次加密防止用户明文密码在网络上传输,第二次加密防止数据库被盗后将一次加密反向破解

引入依赖commons-codec和commons-lang3,使用commons-codec依赖下的DigestUtils类的md5Hex方法加密处理

安全起见,使用固定salt(就是一个字符串)中的部分字符与密码拼接后进行第一次加密

第二次加密使用随机salt,通过入参salt来传递

三、JSR303参数检验+全局异常处理器

jsr303参数校验

1、pom.xml 引入依赖spring-boot-starter-validation,该依赖包含了hibernate-validator依赖

2、LoginController.java 删除之前的参数校验部分,在doLogin方法的LoginVo类型入参前加上@Valid注解,该注解在validation-api依赖下,然而该依赖并没有手动引入,可能是新建SpringBoot项目时自动引入了。

3、LoginVo.java 在password变量前添加@NotNull注解,@Length注解;在mobile变量前添加@NotNull注解,@IsMobile注解,其中@NotNull和@Length在validation-api依赖下,@IsMobile注解为接下来要自定义的注解。

4、IsMobile.java 新建注解,拷贝@NotNull注解中的部分内容,仿照着@NotNull注解来写。在拷贝过来的@Constraint(validateBy={})中添加将要新建的IsMobileValidator.class类,做为校验器,改完之后为@Constraint(validateBy={IsMobileValidator.class})。添加boolean required() default true; 表示标注该注解的变量必需要传值。

5、IsMobileValidator.class 新建类,作为校验器,需要实现ConstraintValidator<A, T>接口,A处就填IsMobile,T处填了String。实现父接口中的两个方法,initialize和isValid方法。

6、运行测试,浏览器检查代码的Netword部分会提示需要的信息和异常信息。异常信息需要捕获,需要的信息才可以正常提示,见下节。

异常处理

标题:异常处理

1、GlobalExceptionHandler.java 新建类,添加exceptionHandler方法,该方法需标注@ExceptionHandler(value = Exception.class) 表示要拦截所有的异常,方法体内先拦截刚才的BindException,步骤依次为异常类型强转,获取所有错误信息,拿到第一个错误,拿到具体错误信息,最后拼接完后返回。拼接调用接下来的CodeMsg.java类中的fillArgs方法。

2、CodeMsg.java 添加绑定异常静态常量BIND_ERROR,注意他的msg参数处留一个位置。添加fillArgs方法,供第一步拼接时调用。

写在最后:这样,浏览器中的异常信息,经过上述代码就可以捕获并处理,最终友好的显示在浏览器页面。

标题:异常处理优化

0、导语:之前MiaoshaUserService.java类中login方法的返回值为CodeMsg类型,但是应该返回表达业务方法含义的方法,而不应该是CodeMsg类型。所以我们可以定义一个全局异常类,将异常直接抛出去,交给异常处理器处理。

1、GlobalException.java 新建异常类,封装CodeMsg类型变量,供抛出时实例化使用。

2、MiaoshaUserService.java 修改login方法返回类型为boolean,方法体内的错误直接通过实例化GlobalException类,并入参CodeMsg类型的静态常量,来将异常抛出去。

3、GlobalExceptionHandler.java 修改exceptionHandler方法,增加处理GlobalException异常的逻辑。

4、LoginController.java 修改doLogin方法,优化登录逻辑。

写在最后:方法的返回类型要根据业务方法含义来判断,方法体内遇到的错误可以通过自定义异常封装类和异常处理类来拦截再处理。

四、分布式Session

详见github上的提交https://github.com/yanguobin/mymiaosha

(二)Java秒杀项目之实现登录功能的更多相关文章

  1. Vue项目之实现登录功能的表单验证!

    Vue项目之实现登录功能的表单验证! 步骤: 配置 Form表单验证; 1.必须给el-from组件绑定model 为表单数据对象 2 给需要验证的表单项 el-form-item 绑定 prop 属 ...

  2. node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能

    第一章 建议学习时间8小时·分两次学习      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章]) 视频教程地 ...

  3. 项目开发-->一键登录功能汇总

    开发网站经常会提供一些一键登录功能,如:QQ.新浪微博.淘宝账号.开心网账号.人人网账号等进行快捷登录,下面记录几个常用的开放平台地址,方便以后开发需要. 1.QQ互联 2.新浪微博 网站接入QQ互联 ...

  4. Java Web项目案例之---登录注册和增删改查(jsp+servlet)

    登录注册和增删改查(jsp+servlet) (一)功能介绍 1.用户输入正确的密码进行登录 2.新用户可以进行注册 3.登录后显示学生的信息表 4.可以添加学生 5.可以修改学生已有信息 6.可以删 ...

  5. Java Web项目案例之---登录和注册(精华版)

    登录和注册(精华版) (一)实现功能 1.使用cookie记录登录成功的用户名,用户选择记住用户名,则用户再次登录时用户名自动显示 2.实现文件上传功能(上传文件的表单上传于普通的表单上传不同,必须是 ...

  6. (五)Java秒杀项目之页面优化

    一.页面缓存+URL缓存+对象缓存 1.通过加缓存来减少对数据库的访问 2.步骤: 取缓存 手动渲染模版 结果输出 3.页面缓存和URL缓存的过期时间比较短,比较适合变化不大的场景,比如商品列表页.而 ...

  7. (一)Java秒杀项目之项目环境搭建

    一.Spring Boot环境搭建 1.把项目分成多个模块,每个模块对应一部分(不一定是一个章节)的内容,代码将在文章的具体位置给出,每个模块都是在之前模块的基础上构建,每个模块都为Spring Bo ...

  8. (六)Java秒杀项目之接口优化

    一.Redis预减库存减少数据库访问 思路:减少数据库访问 1.系统初始化,把商品库存数量加载到Redis 2.收到请求,Redis预减库存,库存不足,直接返回,否则进入3 3.请求入队,立即返回排队 ...

  9. 一百二十三:CMS系统之登录功能

    配置文件中加入前台用户的身份标识 form class SigninForm(BaseForm): telephone = StringField(validators=[Regexp(r'1[345 ...

随机推荐

  1. P2015 二叉苹果树,树形dp

    P2015 二叉苹果树 题目大意:有一棵二叉树性质的苹果树,每一根树枝上都有着一些苹果,现在要去掉一些树枝,只留下q根树枝,要求保留最多的苹果数(去掉树枝后不一定是二叉树) 思路:一开始就很直接的想到 ...

  2. 2019牛客暑期多校训练营(第二场)J

    题意 给一个长度为1e9的只包含1和-1的数列,1的个数不超过1e7,计算有多少对\((l,r)\)满足\(\sum_{i=l}^r a[i]>0\) 分析 dp求出每段连续的1最右端为右端点的 ...

  3. Spring——5种增强方式

    一.前置增强 二.后置增强 三.环绕增强  环绕增强相当于前置增强和后置增强的结合体,可以使用<aop:around>进行处理,这里我采用代理工厂的方式 1.接口及其实现类 public ...

  4. 本地创建的项目使用版本管理(git)推送至远端。

    1.创建项目 mkdir nidexiangmu cd nidexiangmu touch README.md 2.使用 git 命令管理 git init // 建立本地仓库 git add . / ...

  5. JQuery属性操作之attr()和prop()的区别

    代码示例: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...

  6. CentOS7 安装JumpServer

    环境: CentOS Linux release 7.6.1810 (Core) JumpServer 1.4.8 Python 3.6.X MariaDB 编译安装Python3.6 首先,下载Py ...

  7. (十)C语言之putchar、getchar

  8. TCP主动打开 之 第三次握手-发送ACK

    假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包SYN+ACK,在经过一系列处理之后,客户端发送第三次握手包ACK到服务器:其流程比较简单,主要是分配skb,初始化ack包并发送:需要注意 ...

  9. 基本CSS布局三

    基本CSS布局三------图片视频网格 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...

  10. 访问H2数据库的SpringBoot工程

    JDK:1.8.0_212 IDE:STS4(Spring Tool Suit4 Version: 4.3.2.RELEASE) 工程下载:https://files.cnblogs.com/file ...