在開始編碼前,先建立幾個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狀態碼,不符合預期,但也可以作參考,影響不大
我們簡單的用戶登錄系統及這樣了,其實我們還可以加入用戶注冊方法,大家可以自行嘗試,我這里就不下了
以后的代碼可能沒這么詳細了,只對重點代碼做解釋
希望給大家做一個參考
