一、数据库设计

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. 数位dp入门(内容一样,新版格式)

    顾名思义,数位dp,是一种用来计数的dp,就是把一个数字拆成一个一个数位去统计 如果现在给你一道题,需要你求在区间[l,r]内满足条件的解的个数,我们很容易想到去暴力枚举,但要是数据范围太大这种办法就 ...

  2. python内置模块(time模块)

    常用的python内置模块 一.time模块 在python的三种时间表现形式: 1.时间戳,给电脑看的. - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒. impor ...

  3. RabbitMQ TTL、死信队列

    TTL概念 TTL是Time To Live的缩写,也就是生存时间. RabbitMQ支持消息的过期时间,在消息发送时可以进行指定. RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过 ...

  4. [CSP-S模拟测试]:凉宫春日的忧郁(乱搞)

    题目传送门(内部题101) 输入格式 第一行输入一个整数$T$,表示数据组数. 接下来$T$行,每行两个数$X,Y$,表示$T$组数据. 输出格式 输出共有$T$行,对于每一组数据,如果$X^Y\le ...

  5. python3笔记十七:python文件读写

    一:学习内容 读文件 写文件 编码与解码 二:读文件--步骤分解 1.过程 第一步:打开文件第二步:读文件内容第三步:关闭文件 2.第一步:打开文件 open(path,flag[,encoding] ...

  6. 如何安装Vscode软件及设置成中文界面?

    最新小编开始研究前端,想写点东东玩,要想开始首先就要安装工具,写前端有好几个工具,安装推荐开源的vscode,第一次安装是英文版的,如何修改成中文版,也是很简单的,跟随小编一起来安装设置工具吧. 方法 ...

  7. ubuntu安装mysql 5.7

    1.安装mysql sudo apt-get install mysql-client mysql-server 2.启动 service mysqld start 3.登陆 mysql -uroot ...

  8. koa 项目实战(一)创建项目

    1.安装模块 npm install koa koa-router --save npm install -g nodemon 2.入口文件 app.js const Koa = require('k ...

  9. python 面对对象 类(继承, 多态)

    继承,继承其它实例化样本的属性和方法,需要在声明里重新定义和使用 class School(object): def __init__(self, name, addr): self.name = n ...

  10. ACO 蚁群算法(算法流程,TSP例子解析)

    算法 计算机 超级计算 高性能 科学探索 1. 算法背景——蚁群的自组织行为特征 高度结构化的组织——虽然蚂蚁的个体行为极其简单,但由个体组成的蚁群却构成高度结构化的社会组织,蚂蚁社会的成员有分工,有 ...