在开始编码前,先建立几个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 - 建立简单的用户登录系统的更多相关文章

  1. php建立简单的用户留言系统

    php建立简单的用户留言系统 样例 addMsg.php--添加留言页面 doAction.php--响应添加留言页面 . viewMsg.php--显示留言页面 目录结构 addMsg.php--添 ...

  2. 纯jsp用户登录系统

    用纯jsp技术实现用户登录系统,需要用到三个.jsp文件.在文本目录下新建三个.jsp文件,分别命名为login.jsp,logincl.jsp和wel.jsp. 1.login.jsp文件用来放界面 ...

  3. 利用shell脚本做一个用户登录系统

    效果图如下: #!/bin/bash# while truedocat << EOF//======================\\\\| 用户登录系统 |-------------- ...

  4. 用javascript实现简单的用户登录验证

    用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  5. Python之简单的用户登录和注册

    # -*- coding: utf-8 -*- # @Time : 2018/7/26 20:16 # @Author : Adam # @File : exam2.py # @Project: ke ...

  6. 【SSH学习笔记】用Struts2实现简单的用户登录

    准备阶段 在使用学习Struts2的时候首先要下载相应的架包 Struts2资源下载 这里建议下载第一个,在struts-2.5.14.1-all.zip里有很多实用的东西,不仅有架包还有官方为开发者 ...

  7. 建立SQL Server用户登录

    第一步:右击服务器名,点击"属性",选择"安全性",选中"Sql server和Windows身份验证模式". 第二步:鼠标右键点击安全性中 ...

  8. Java简单示例-用户登录、单个页面的增删改查及简单分页

    index.html  -登录->stulist.jsp (index.html传递到LoginServlet,进行登录检测及写入session,NO返回index.html界面,OK 跳转到s ...

  9. 【python】实例-用户登录系统

    有N,E,Q三个选择,若选择Q或者中断,则系统退出.若其他选项,则持续让用户选择. #!/usr/bin/env python db = {} def newuser(): prompt = 'log ...

随机推荐

  1. ASP.NET之报表--RDLC(一)---附源码

    听同事介绍到RDLC,之前有了解过报表,但是确实没什么放在心上.最近有空,就研究下了. 一.RDLC实现 1.步骤 (1)首先新建一个项目RDLCDemo (2)新建一个DataSet数据集,并且绑定 ...

  2. Spring MVC 复习笔记04

    复习 springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以通 ...

  3. Web前端学习笔记之前端跨域知识总结

    0x00 前言 相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的.但跨域方法的多种多样实在让人目不暇接.老规矩,碰到这种情况,就只能自己总结一篇博客,作为记录. 0x01 什 ...

  4. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

  5. POJ - 3254 Corn Fields(状压DP)题解

    思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...

  6. 微信小程序登录,获取code,获取openid,获取session_key

    微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...

  7. SSH基本管理和配置文件的使用

    服务端:linl_S    IP:10.0.0.15 客户端:lin_C    IP:10.0.0.16   SSHD服务 SSH协议:安全外壳协议.为Secure Shell的缩写.SSH为建立在应 ...

  8. 【Docker】Windows下docker环境搭建及解决使用非官方终端时的连接问题

    背景 时常有容器方面的需求,经常构建调试导致测试环境有些混乱,所以想在本地构建一套环境,镜像调试稳定后再放到测试环境中. Windows Docker 安装 安装docker toolbox 博主的电 ...

  9. 安装 android4.0 到 vmware的注意点

    我发现无论如何,wmware上是出不来声音的. 我放弃 android-x86-4.3-20130725.iso 在 声音上有问题 现在安装这个版本: android-x86-4.0-RC2-eeep ...

  10. UVALive-3415 Guardian of Decency (最大独立集)

    题目大意:一个老师要带一些学生去春游,但是要带的学生中任意两个人都满足下面四个条件中的至少一个:1.性别相同:2.身高差大与40公分:3.最喜欢的音乐类型不同:4.最喜欢的体育运动相同.问老师最多能带 ...