从0到1开发测试平台(六)增加登录接口
上篇文章我们了解了resultful相关知识,因此我们需要修改UserController,增加接口版本号,在类上面增加注解@RequestMapping("/api/v1/user"),修改之后UserController如下所示
package com.caomingyu.cctestplatform.controller;
import com.caomingyu.cctestplatform.bean.User;
import com.caomingyu.cctestplatform.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/queryUser")
public List<User> queryUser(){
List<User> userList = userService.queryUserList();
return userList;
}
}
登录功能如果是上线系统需要考虑的点比较多,比如认证和授权,登录密码错误超过3次弹出图形验证码,超过5次锁定账号一小时,单点登录,加密方式比如2次md5加密加盐或者aes加密等等,登录成功之后登录信息存到操作日志和登录表等等,在这里我们用最小白的方式来做登录功能。
接下来我们就来新增登录接口
登录接口我们采用post请求方式,需要传入json格式User对象,所以我们的入参需要加上@RequestBody对象,否则,前端传入的参数后端无法接受,会出现接受的参数为空的情况。
这里我们对密码只做了一次md5加密处理,增加util包,新增Md5加密类Md5Utils.java
package com.caomingyu.cctestplatform.util;
import java.security.MessageDigest;
public class Md5Utils {
/***
* MD5加码 生成32位md5码
*/
public static String string2MD5(String inStr){
MessageDigest md5 = null;
try{
md5 = MessageDigest.getInstance("MD5");
}catch (Exception e){
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++){
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}
UserMapper.xml增加登录校验用户的sql
<select id="queryUserByName" resultType="com.caomingyu.cctestplatform.bean.User">
select * from user where username = #{userName}
</select>
UserDao.java增加queryUserByName方法
User queryUserByName(String userName);
UserService.java增加queryUserByNamehe和login方法
User queryUserByName(String userName);
Integer login(String userName,String password);
UserServiceImpl.java增加queryUserByNamehe和login方法
@Override
public User queryUserByName(String userName) {
return userDao.queryUserByName(userName);
}
@Override
public Integer login(String userName, String password) {
User user = queryUserByName(userName);
if (user == null){
return -1;
}
String passwordParam = Md5Utils.string2MD5(password);
if (!passwordParam.equals(user.getPassword())){
return -1;
}
return 0;
}
UserController.java增加login方法
@PostMapping("/login")
public String login(@RequestBody User user){
if (user == null){
return "登录失败";
}
if (user.getUserName() == null || "".equals(user.getUserName())){
return "登录失败";
}
if (user.getPassword() == null || "".equals(user.getPassword())){
return "登录失败";
}
Integer result = userService.login(user.getUserName(), user.getPassword());
if (result == -1){
return "登录失败";
}
return "登录成功";
}
我们打开postman大概测试下,用户名存在的账号:13012345678,密码:123456,如下
用户名和密码都不对
用户名正确/密码错误
用户名/密码正确
以上只是对主要流程进行大致验证,并没有对用户名密码长度做校验,参数也没用加解密,如果你有需要可以自己尝试做下,下一篇后端的文章会对登录接口做优化,我们这里还是有不少问题的。
- [编程经验]Python中的Lambda,Map, Reduce小结
- TensorFlow从0到1 - 6 - 解锁梯度下降算法
- linux下join命令的用法
- [编程经验] 我是如何半自动抓取素材公社图片的
- linux 便捷使用防火墙控制端口访问
- 洛谷 P3802 小魔女帕琪
- 【前沿】见人识面,TensorFlow实现人脸性别/年龄识别
- TensorFlow从0到1 - 1 - Hello, TensorFlow!
- iOS自动布局——Masonry详解
- BZOJ 3450: Tyvj1952 Easy
- [编程经验] TensorFlow实现线性支持向量机SVM
- TensorFlow从0到1 - 2 - TensorFlow核心编程
- BZOJ 4318: OSU!
- 讨厌算法的程序员 5 - 合并算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法