1. 用户登录实现
1.1 表设计
1.表结构定义
2.编辑POJO
package com.jt.pojo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author 刘昱江
* 时间 2021/2/2
*/
@Data
@Accessors(chain = true)
public class User extends BasePojo{
private Integer id;
private String username;
private String password;
private String phone;
private String email;
private Boolean status; //true 正常 false 停用
}
1.2 业务接口文档
请求路径: /user/login
请求方式: POST
请求参数
参数名称 | 参数说明 | 备注 |
---|---|---|
username | 用户名 | 不能为空 |
password | 密码 | 不能为空 |
响应数据 SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回密钥token信息 |
返回值格式如下:
{"status":200,"msg":"服务器调用成功!","data":"1e893a97634847b3a8b499b173bea620"}
1.3 创建SysResult对象
说明: 前端与后端进行业务交互.需要有一个统一的返回数据的结构,而这种负责前后端交互的媒介.称之为vo对象.
package com.jt.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult implements Serializable {
private Integer status; //200成功 201失败
private String msg; //提示信息
private Object data; //服务器返回值数据
public static SysResult fail(){
return new SysResult(201,"业务调用失败!!",null);
}
public static SysResult success(){
return new SysResult(200,"业务调用成功!!",null);
}
public static SysResult success(Object data){
return new SysResult(200,"业务调用成功!!",data);
}
public static SysResult success(String msg,Object data){
return new SysResult(200,msg,data);
}
}
1.4编辑UserController
package com.jt.controller;
import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
/**
* 业务: 完成用户登录操作
* URL: /user/login
* 参数: username/password json串
* 返回值: SysResult对象 token密钥
*/
@PostMapping("/login")
public SysResult login(@RequestBody User user){
//业务逻辑: 根据u/p查询数据库 true: token false null
String token = userService.login(user);
if(token == null){
//表示后端查询失败,返回用户201
return SysResult.fail();
} //表示有数据,返回值为200
return SysResult.success(token);
}
}
1.5 md5加密算法
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
常识性问题:
1.如果数据相同 算法相同 结果必然相同.
2.如果数据不同 算法相同 结果可能相同. hash碰撞问题.
规则:
数据可以穷举查询.但是不可以被破解.
1.6 编辑UserService
/**
* 思路:
* user数据:User(id=null, username=abc, password=123, phone=null, email=null, status=null)
* 1.将密码明文,转化为密文 sha1/md5算法/md5hash
* 2.根据用户名和密码查询用户信息
* 3.有结果: 返回token UUID
* 4.没有结果: 返回null
* @param user
* @return
*/
@Override
public String login(User user) {
String password = user.getPassword();
byte[] bytes = password.getBytes();
//1.将密码加密
String md5Password = DigestUtils.md5DigestAsHex(bytes);
user.setPassword(md5Password);
//2.根据用户名和密码查询数据库
User userDB = userMapper.findUserByUP(user);
//3.判断userDB是否有值
if(userDB == null){
//用户名和密码查询错误
return null;
}
//程序走到这里,说明用户名和密码正确 返回token
String token = UUID.randomUUID().toString();
return token;
}
1.7 编辑UserMapper
编辑Mapper接口
User findUserByUP(User user);
编辑Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.UserMapper">
<select id="findAll" resultType="User">
select * from user
</select>
<select id="findUserByUP" resultType="User">
select * from user
where username=#{username}
and password = #{password}
</select>
</mapper>
1.8 关于报错解决方案
1.8.1 F12开发者工具查询请求路径
1.8.3 检查返回值问题
通过response选项 检查返回值 是否与预期一致.