一、数据库设计

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. flask框架(十一): 蓝图

    蓝图用于为应用提供目录划分: 一:上目录结构 二:上代码 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. Killer Problem (UVA 11898 )

    Problem You are given an array of N integers and Q queries. Each query is a closed interval [l, r]. ...

  3. 7.9T2EASY(easy)

    EASY(easy) sol:非常经典的题,取了一次之后,把线段树上这一段变成相反数 然后再贪心取和最大的. 重复以上操作,发现最后一定有对应的解,且根据贪心过程一定 是最大的 线段树上维护区间和最大 ...

  4. Android_(消息提示)多种使用Toast的消息提示

    Toast是一种提供给用户简介信息的视图,可以创建和显示消息,该视图以浮于应用程序之上的形式呈现给用户.因为它并不获得焦点,即使用户正在输入什么也不会受到影响. Toast目标是尽可能以不显眼的方式, ...

  5. Java_GUI小游戏--贪吃蛇

    贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或 ...

  6. BZOJ1718分离的路径

    边双题. 求的就是最少加几条边可以使一个图变成边双联通图. 首先tarjan求一下边双,缩完点变成一颗树,统计度数为1的点(无根树的叶子),把这个数算出来,设为x,则ans=(x+1)/2. 这个可以 ...

  7. SRS之RTMP连接处理线程conn:接收客户端推流

    由 SRS之RTMP的TCP线程 分析可知,SRS 接受客户端的连接后创建了一个线程:conn,用于处理与客户端的 RTMP 连接. 本文的分析是基于该配置文件的: listen 1935; max_ ...

  8. smarty逻辑运算符

    smarty逻辑运算符 eq        equal : 相等 neq       not equal:不等于 gt        greater than:大于 lt        less th ...

  9. koa 基础(十三)koa-art-template 模板引擎的使用

    1.项目目录 2.app.js /** * http://aui.github.io/art-template/koa/ * 1.npm install --save art-template * n ...

  10. centos 6和centos7关闭防火墙的方法

    centos 6 关闭命令:  service iptables stop 永久关闭防火墙:chkconfig iptables off 两个命令同时运行,运行完成后查看防火墙关闭状态         ...