在開始編碼前,先創建幾個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狀態碼,不符合預期,但也能夠做參考,影響不大
咱們簡單的用戶登陸系統及這樣了,其實咱們還能夠加入用戶註冊方法,你們能夠自行嘗試,我這裏就不下了
之後的代碼可能沒這麼詳細了,只對重點代碼作解釋
但願給你們作一個參考