1. 程式人生 > >Springboot - 建立簡單的用戶登錄系統

Springboot - 建立簡單的用戶登錄系統

request index set nal rri 等於 date print 字符串轉換

在開始編碼前,先建立幾個Package(可以按個人習慣命名),如圖

技術分享圖片

1.Controllers 用於存放控制器類

2.Models 用於存放數據實體類

3.Repositories 用於存放數據庫操作接口

4. Services 用於存放業務邏輯類

5. Tools用於存放工具類

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

一、建立User實體類

首先在Models下新建名為User.java的實體類,

代碼如下

 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 }

二、新建CrudRepostory接口

在Repositories下新建一個名為UserRepository的接口,需要繼承CrudRepository

CrudRepository是包含基礎增刪改查操作的Repository

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

其中不需要添加任何自定義方法就可以實現基礎的數據庫操作

三、新建用戶登錄操作業務類

在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類

四、建立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狀態碼,不符合預期,但也可以作參考,影響不大

我們簡單的用戶登錄系統及這樣了,其實我們還可以加入用戶註冊方法,大家可以自行嘗試,我這裏就不下了

以後的代碼可能沒這麽詳細了,只對重點代碼做解釋

希望給大家做一個參考

Springboot - 建立簡單的用戶登錄系統