一、登陆 1.1 表结构的设计

DROP TABLE IF EXISTS `miaosha_user`;
CREATE TABLE `miaosha_user` (`id` bigint(20) NOT NULL COMMENT '用户ID,手机号码',`nickname` varchar(255) NOT NULL COMMENT '用户昵称',`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 '0' COMMENT '登录次数',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码

1.2 两次md5的实现
原理: 将明文密码进行第一次md5加密(加固定盐值) 以后在网络中进行传输没,服务端拿到的是表单密码,将表单密码进行第二次加密成dbPassword,根据用户输出的userId查得user对象,进行密码匹配。 好处:1. 可以避免明文密码直接在网络中传输,减少安全风险;2. 及时用户获取db中存储得密码,也是用户密码进行二次md5加密后得结果(第一次加密固定盐值,第二次加密生成一个随即得盐值),无法直接反查彩虹表得到明文密码,进一步提高了用户登陆得安全系数。

public final static String salt = "d1o2n3g4j5u";/*** 第一次MD5* 对用户输入的密码进行加盐值然后进行MD5加密,加密后的密码是(进行网络传输时展示的密码)** @param inputPass* @return*/
public static String inputPassToFormPass(String inputPass) {String data = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);return md5(data);
}/*** 第二次MD5* 表单密码转换成数据库密码,dbPass是db中存储的密码** @param formPass* @param dbSalt   这个盐值是随即生成的,保存到db当中* @return*/
public static String formPassToDbPass(String formPass, String dbSalt) {String data = dbSalt.charAt(1) + dbSalt.charAt(0) + formPass + dbSalt.charAt(4) + dbSalt.charAt(5);return md5(data);
}/*** 输入的密码直接转换成数据库密码** @param inputPass* @param dbSalt* @return*/
public static String inputPassToDbPass(String inputPass, String dbSalt) {String formPass = inputPassToFormPass(inputPass);return formPassToDbPass(formPass, dbSalt);
}/*** MD5* 对传入的字符串进行加密然后返回加密结果。** @param data* @return*/
public static String md5(String data) // 相关的maven依赖
<!--MD5加密依赖-->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.6</version>
</dependency>
复制代码

1.3 用户登陆参数校验
(1)构建客户端登陆请求参数对象loginDTO
(2) 给loginDTO中的相应对象加上常用的校验注解
(3) 自定义手机号校验注解并注解到loginDTO对象的mobole参数上
(4) controller层的loginDTO参数加上@Vaild注解

自定义@mobile注解进行手机号参数校验

[
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** Created by chenxiong on 18/12/4.*/
@Documented
@Target(value = {ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {MobileConstraintValidator.class})
public @interface IsMobile {boolean required() default true;String message() default "手机号码格式错误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
][
import org.apache.commons.lang.StringUtils;import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.ConstraintViolation;/*** Created by chenxiong on 18/12/4.* 使用@Constraint注解需要自定义一个实现ConstraintValidator接口的校验类。* 注解@Constraint注解在自定义注解@a上,@a注解在类B上* 若类B的作为参数并被@Valid注解所注解,哪么将会调用如下的initialize()和isValid()方法进行参数校验*/
public class MobileConstraintValidator implements ConstraintValidator<IsMobile,String> {private boolean required = false;@Overridepublic void initialize(IsMobile isMobileAnnotation) {required = isMobileAnnotation.required();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (required == false  || StringUtils.isEmpty(value)){return true;}else {return ValidatorUtil.isMobile(value);}}
}
][
import org.apache.commons.lang.StringUtils;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Created by chenxiong on 18/12/4.* 校验工具类*/
public class ValidatorUtil {// 1开头,接十位数字private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");/*** 简单校验手机号码是否合法** @param mobileNum* @return*/public static boolean isMobile(String mobileNum){if (StringUtils.isEmpty(mobileNum)){return false;}Matcher matcher = mobile_pattern.matcher(mobileNum);return matcher.matches();}
}]
复制代码

Second kill system learning相关推荐

  1. Machine Learning week 9 quiz: programming assignment-Anomaly Detection and Recommender Systems

    一.ex8.m %% Machine Learning Online Class % Exercise 8 | Anomaly Detection and Collaborative Filterin ...

  2. Oracle 每个session的限制,限制oracle普通用户能且只能kill自己的会话

    声明: 仅用于测试环境方便调试,不可能应用于生产环境:故请勿加入到程序源代码来实现自动杀进程. 只需一个参数,就能kill用户自己的会话,请小心操作,以免误kill进程. 使用方法: 新开一个sess ...

  3. android kill() 头文件,kill()

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! kill()是一个计算机编程语言函数,Kill函数可以对进程发送signal(); 在linux里使用的Kill命令.实际上是 ...

  4. c# dbgrid数据导出到xlsx和ini中实例

    界面如下: 导出选择 为xlsx或者ini模式 1.导出ini模式  ,我这里是一次导出3个grid的数据. string filename = dlg.FileName;     string fi ...

  5. Zookeeper分布式一致性原理(七):Curator客户端

    1. Curator简介 Curator是Netfix公司开源的一套Zookeeper客户端.Curator解决了很多Zookeeper客户端非常底层的细节开发工作,包括重连.反复注册Watcher和 ...

  6. C语言实现小时候经常做的智力测试题

    下面的是两道面试题,小时候经常会看到这种类似的题目,但是用C语言实现,确实没那么容易想到,尤其是对我这种接触C语言仅仅一年的新人. 话不多说, 先上题........... 1. 5位运动员参加了10 ...

  7. Linux Signals 进程信号简介

    2019独角兽企业重金招聘Python工程师标准>>> 在Linux中,signal是一种局限较强的进程间通信方式. 主要有三种类型: 1. 从hardware signal到POS ...

  8. 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!...

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  9. 我不知道的事——深克隆和浅克隆

    推荐一部好电影<致命魔术>.(此处为植入广告)        推荐理由:涉及人性.画面不错,剧情跌宕,亦魔亦幻(此处的"魔"为魔术的"魔").虽然女 ...

  10. C# 将内存中的datatable数据导出为Excel(方法二,创建Excel对象导出)

    上次写了一个用文件流方式将Datatable导出Excel的方法,这个方法有局限性,比如没法对Excel进行一些增加列颜色等简单的操作,现在,给大家介绍另外一种方法,用微软的Excel类.既然要用到类 ...

最新文章

  1. ios自动布局(1)
  2. 一套简约漂亮的响应式博客园主题皮肤分享给你们(一)
  3. STM32启动文件详解及SystemInit函数分析
  4. Java锁 (概览)
  5. Java在生活中的应用盘点!
  6. 教你制作U盘,内存卡,硬盘等等等的漂亮背景
  7. 关于计算机的英语演讲稿三分钟,以计算机为题的英语演讲稿5
  8. 报名已近500人丨基于AWR/ASH故障分析案例分享
  9. 如何计算机械能的变化量,问:如何计算机械能变化量?
  10. 第U题:Java BigDecimal解决··Noder现在上初三了,正在开始复习中考。他每天要计算型如..............
  11. UNICODE与ASCII码的关系(MTK)
  12. nginx linux脚本,控制 nginx shell脚本语言
  13. python花瓣网_花瓣网花瓣爬虫
  14. 算法导论———归并排序(JAVA、Python)
  15. 制作自己专属的抓包工具
  16. m3u8格式转MP4(ffmpeg方法)
  17. 大气幼儿园html模板,幼儿园儿童HTML主题
  18. foxmail发邮件时总提示接收密码错误是怎么回事
  19. 厉害了,Python也能使用动态链接库
  20. 云渲染最全计费规则合集

热门文章

  1. root用户改动普通用户文件
  2. David Cutler,VMS和Windows NT的首席设计师 (zz.is2120)
  3. gdb在cygwin下的安装
  4. 加入域报错(找不到网络路径)
  5. Matlab将double类型转换为正整数类型
  6. ENVI实验教程(7)实验七、遥感影像变化检测
  7. C++ error C3867 请使用 ““ 来创建指向成员的指针
  8. 仿淘宝验证码 php,PHP中仿制 ecshop验证码实例
  9. JavaSE学习--HTML
  10. php检测手机是否开飞行模式,Android_android 如何判断当前是否为飞行模式,Android中如何判断系统当前是否 - phpStudy...