一. 数据准备
1. 创建一个user表:
CREATE TABLE users ( user_id INT(6) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NULL, password VARCHAR(100) NULL, status INT(1) DEFAULT 1 NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL );
2. 创建对应的实体类
import java.sql.Timestamp; public class User { private Integer userId; private String name; private String password; private Integer status; private Timestamp createTime; //getter,setter,toString..... }
3. UserMapper
public interface UserMapper { User queryByName(String name); Integer doInsert(User user); }
4. UserMapper.xml
<?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="io.zhangjia.springbootmd5.mapper.UserMapper"> <select id="queryByName" resultType="user"> SELECT * FROM users WHERE name = #{name} </select> <insert id="doInsert" useGeneratedKeys="true" keyProperty="userId"> INSERT INTO users (name, password) VALUE (#{name}, #{password}) </insert> </mapper>
二. MD5加密
MD5是一种常用的加密算法,且该加密算法是单向的,也就是说是不可逆的,但是固定的值的MD5密文是固定的,所以网上有很多在线的MD5解密网站,但基本上都是采用撞库等原理,破解率也很低。可以采用多次加密等方法降低破解率。
Spring为我们提供了一个与MD5相关的工具类:DigestUtils,通过调用该类的md5DigestAsHex方法,并传入一个字节数组即可生成对应的MD5密文:
@Test public void md5(){ String s = "zhangjia"; System.out.println(DigestUtils.md5DigestAsHex(s.getBytes())); } 输出: 0d3159db0bb0eb3ea0a74aa21ae3e826
上面的输出即为zhangjia所对应的md5,但是这样直接加密非常不安全,我们可以采用拼接字符串的方法来生成md5,以用户注册为例,我们可以把用户名+密码 拼接起来后,再转换成md5
三. 使用MD5加密后实现用户登录注册
用户的登录以及注册和我们以前的项目几乎一模一样,但是在登录的时候,不能再直接使用用户输入的密码和数据库中的密码进行比对。应首先将用户输入的密码按照我们规定的转换规则先转换成MD5,然后再将其和数据库的密码进行比对。同样注册的时候,存储密码前需要先将其转换为md5的格式再存储。 UserServiceImpl.java:
import java.util.HashMap; import java.util.Map; @Service("userService") public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Map<String, Object> login(String name, String password) { Map<String, Object> map = new HashMap<>(); User user = userMapper.queryByName(name); if(user == null) { map.put("error","用户名不存在"); } else { String password2 = user.getPassword(); String md5 = MD5Util.getMd5(name.concat(password)); if(password2.equals(md5)) { user.setPassword(null); map.put("success",true); map.put("user",user); } else { map.put("error","密码错误"); } } return map; } @Override public Map<String, Object> register(String name, String password) { Map<String,Object> map = new HashMap<>(); if(userMapper.queryByName(name) == null) { String md5 = MD5Util.getMd5(name.concat(password)); User user = new User(); user.setName(name); user.setPassword(md5); Integer integer = userMapper.doInsert(user); map.put("success", integer == 1); } else { map.put("error","用户名已经存在啦"); } return map; } }
最后编写Controller即可:
import io.zhangjia.springbootmd5.entity.User; import io.zhangjia.springbootmd5.service.UserService; import io.zhangjia.springbootmd5.util.R; import io.zhangjia.springbootmd5.util.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Map; @Controller public class UserController2 { @Autowired private UserService userService; @PostMapping(value = "/login", produces = "application/json;charset=utf-8") @ResponseBody public R login(String name, String password) { Map<String, Object> map = userService.login(name, password); if (map.containsKey("error")) { return R.error(map); } else { return R.success(map); } } @PostMapping(value = "/register", produces = "application/json;charset=utf-8") @ResponseBody public R register(String name, String password) { Map<String, Object> map = userService.register(name, password); if (map.containsKey("error")) { return R.error(map); } else { return R.success(map); } } }
假如我们的数据库中有一个用户:zhangjia,密码也是zhangjia,那么我们访问http://localhost:8888/login?name=zhangjia&password=zhang,则页面显示:
{ "data": { "error": "密码错误" }, "success": false }
如果输入一个不存在的用户名,则页面显示
{ "data": { "error": "用户名不存在" }, "success": false }
请登录之后再进行评论