Springboot系列 3 - 创建简单的用户登陆系统

在开始编码前,先创建几个Package(能够按我的习惯命名),如图java

1.Controllers 用于存放控制器类git

2.Models 用于存放数据实体类数据库

3.Repositories 用于存放数据库操做接口api

4. Services 用于存放业务逻辑类数组

5. Tools用于存放工具类app

-----------------------------------------------------------------------------------------------------------------------------ide

1、创建User实体类工具

首先在Models下新建名为User.java的实体类,post

代码以下测试

 1 @Entity //实体注入  2 @Table(name = "sys_user") //映射对应代表  3 public class User {  4  @Id //主键Id  5     @GeneratedValue(strategy = GenerationType.IDENTITY)  6     private Long id;  7     private String userName;  8     private String hashedPassword;  9 
10     //省略getter和setter 11 
12     //重写toString方法便于后期调试查看数据
13  @Override 14     public String toString() { 15         return "User{" +
16                 "id=" + id +
17                 ", userName='" + userName + '\'' +
18                 ", hashedPassword='" + hashedPassword + '\'' +
19                 '}'; 20  } 21 }

2、新建CrudRepostory接口

在Repositories下新建一个名为UserRepository的接口,须要继承CrudRepository

CrudRepository是包含基础增删改查操做的Repository

public interface UserRepository extends CrudRepository<User,Long> { }

其中不须要添加任何自定义方法就能够实现基础的数据库操做

3、新建用户登陆操做业务类

在Services下新建UserService.java

 1 @Service  2 public class UserService {  3     //Autowire装配UserRepository数据库操做类
 4  @Autowired  5  UserRepository userRepository;  6 
 7     /**
 8  * 基础登陆逻辑  9  * @param userName 用户名 10  * @param password MD5 hashed密码 11  * @return
12      */
13     public boolean login(String userName,String password){ 14         Iterable<User> users = userRepository.findAll(); 15         for (User u: 16  users) { 17             if(u.getUserName().equals(userName) && u.getHashedPassword().equals(password)){ 18                 return true; 19  } 20  } 21         return false; 22  } 23 }

很简单一个操做类,就很少做说明了

@Service注解表示这是一个Service类

4、创建Controller

在Controllers下创建UserController.java

 1 @RestController  2 @RequestMapping(value = "/api/account")  3 public class UserController {  4  @Autowired  5  UserService userService;  6     @RequestMapping(value = "/login/{username}/{password}",method = RequestMethod.GET)  7     public boolean login(@PathVariable("username") String userName,@PathVariable("password") String password){  8         return userService.login(userName,password);  9  } 10 }

@RequestMapping 路由地址

@RestController 注解表示这是一个RESTController

@PathVariable 表示这是一个路由变量

-------------------------------------------------------------------------------------------------------------------------------------------

没什么问题保存后,就能够调试运行了

运行成功后,打开PostMan 经过Get方法访问咱们的 http://localhost:8080/api/account/login/admin/admin

发送请求,因为咱们数据库中没有任何数据,返回false

 

下边咱们改造一下咱们的登陆结构,并为数据库添加一下基础数据

首先在UserRepository.java添加一个getByUserName方法

1 public interface UserRepository extends CrudRepository<User,Long> { 2     //根据用户名查找用户
3     Optional<User> getByUserName(String userName); 4 }

为了返回指定格式数据,咱们还要在Models下创建一个Result.java

 

 1 public class Result<T> {  2     private Integer errCode;  3     private String errMessage;  4     private T data;  5 
 6     //省略getter和setter
 7  @Override  8     public String toString() {  9         return "Result{" +
10                 "errCode=" + errCode +
11                 ", errMessage='" + errMessage + '\'' +
12                 ", data=" + data +
13                 '}'; 14  } 15 }

修改UserService.java,修改登陆逻辑,增长添加初始数据

 1 @Service  2 public class UserService {  3     //Autowire装配UserRepository数据库操做类
 4  @Autowired  5  UserRepository userRepository;  6 
 7     /**
 8  * 基础登陆逻辑  9  * @param userName 用户名 10  * @param password MD5 hashed密码 11  * @return
12      */
13     public Result<Long> login(String userName, String password){ 14         Result<Long> result = new Result<>(); 15         User u = userRepository.getByUserName(userName).get(); 16         if(u == null){ 17             result.setErrCode(-1); 18             result.setErrMessage("用户不存在"); 19         }else if(u.getHashedPassword().equals(password)){ 20  System.out.println(u.toString()); 21             result.setErrCode(0); 22  result.setData(u.getId()); 23         }else { 24             result.setErrCode(1); 25             result.setErrMessage("密码错误"); 26  } 27         return result; 28  } 29 
30     public Result<User> add(User user){ 31         Result<User> result = new Result<>(); 32         User u = userRepository.save(user); 33         if(u != null){ 34             result.setErrCode(0); 35  result.setData(u); 36         }else { 37             result.setErrCode(-1); 38             result.setErrMessage("发生错误"); 39  } 40         return result; 41  } 42 
43     public void initUserData(){ 44         Iterable<User> users = userRepository.findAll(); 45         int sum = 0; 46         while (users.iterator().hasNext()){ 47  users.iterator().next(); 48             sum++; 49  } 50         if(sum == 0){ 51             for (int i = 0; i < 5; i++){ 52                 User user = new User(); 53                 user.setUserName("Admin" + i); 54                 String hashedPassword = Encrypt.stringMD5("Admin" + i); 55  user.setHashedPassword(hashedPassword); 56  add(user); 57  } 58  } 59 
60     }

其中用到的MD5加密类在Tools路径中,代码以下

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Encrypt { public static String stringMD5(String input) { try { // 拿到一个MD5转换器(若是想要SHA1参数换成”SHA1”)
            MessageDigest messageDigest =MessageDigest.getInstance("MD5"); // 输入的字符串转换成字节数组
            byte[] inputByteArray = input.getBytes(); // inputByteArray是输入字符串转换获得的字节数组
 messageDigest.update(inputByteArray); // 转换并返回结果,也是字节数组,包含16个元素
            byte[] resultByteArray = messageDigest.digest(); // 字符数组转换成字符串返回
            return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } } public static String byteArrayToHex(byte[] byteArray) { // 首先初始化一个字符数组,用来存放每一个16进制字符
        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' }; // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
        char[] resultCharArray =new char[byteArray.length * 2]; // 遍历字节数组,经过位运算(位运算效率高),转换成字符放到字符数组中去
        int index = 0; for (byte b : byteArray) { resultCharArray[index++] = hexDigits[b>>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b& 0xf]; } // 字符数组组合成字符串返回
        return new String(resultCharArray); } }

在UserController中增长一个初始化数据路由方法

@RequestMapping(value = "/",method = RequestMethod.GET) public void initData(){ userService.initUserData(); }

调试运行项目

PostMan先请求 http://localhost:8080/api/account/

查看数据库,发现初始数据已经添加进来了

咱们继续测试一下Login方法吧

(1)请求正确数据  http://localhost:8080/api/account/login/Admin1/2E33A9B0B06AA0A01EDE70995674EE23

返回 

{
"errCode": 0,
"errMessage": null,
"data": 2
}

返回正确

(2)请求错误数据 http://localhost:8080/api/account/login/Admin1/2E33A9B0B06A

返回

{
"errCode": 1,
"errMessage": "密码错误",
"data": null
}

返回密码错误,也符合咱们的结果

(3)请求不存在用户数据 http://localhost:8080/api/account/login/blogn/2E33A9B0B06AA0A01EDE70995674

返回

{
"timestamp": "2018-07-17T13:52:24.082+0000",
"status": 500,
"error": "Internal Server Error",
"message": "No value present",
"path": "/api/account/login/blogn/2E33A9B0B06AA0A01EDE70995674"
}

系统自动返回500状态码,不符合预期,但也能够做参考,影响不大

 

咱们简单的用户登陆系统及这样了,其实咱们还能够加入用户注册方法,你们能够自行尝试,我这里就不下了

之后的代码可能没这么详细了,只对重点代码作解释

但愿给你们作一个参考

相关文章
相关标签/搜索