Springboot简单用户登录验证
初版结合了spring后,以及前面l连接数据库的内容,做出初版的页面匹配代码先创建一个User类,如果输入的用户名存在,就从数据库中将这个用户的信息读取出来存储到我们创建的user类中,然后与输入的密码进行匹配通过lombok插件,可以省略类里面的很多的创建步骤import lombok.*;//set,get方法,构造方法有参无参,toString方法@Setter@Getter@AllArgs
目录
初版(代码糅在一块)
结合了spring后,以及前面l连接数据库的内容,做出初版的页面匹配代码
先创建一个User类,如果输入的用户名存在,就从数据库中将这个用户的信息读取出来存储到我们创建的user类中,然后与输入的密码进行匹配
通过lombok插件,可以省略类里面的很多的创建步骤
import lombok.*;
//set,get方法,构造方法有参无参,toString方法
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private String userid;
private String username;
private String password;
}
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
//返回值是String类型的内容
@RestController
public class UserController3 {
//登录的接口
@RequestMapping("/userlogin")
public String userlogin(String username,String password){
try {
//连接数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/test", "root", "123456");
PreparedStatement ps = conn.prepareStatement("select * from login where username=?");
ps.setString(1,username);
ResultSet rs = ps.executeQuery();
//查询的用户下面没有内容,返回用户不存在
if(!rs.next()){
return "该用户不存在";
}
//刚才的rs中已经读取到了关于用户的所有信息,我们将他通过数据库中的字段名称获取后,通过User类的构造方法储存
User user = new User(
rs.getString("userid"),
rs.getString("username"),
rs.getString("password"));
//如果数据库中存储对应的密码与你输入的密码不匹配,返回密码错误,把不为空的值放在前可以有效避免空指针异常,
if(!(user.getPassword()).equals(password)){
return "你的密码错误";
}
conn.close();
ps.close();
rs.close();
}catch (Exception e){
e.printStackTrace();
}
return "登录成功";
}
}
我们来进行测试:
输入正确的用户名以及密码
输入正确的用户名和错误的密码
不存在的用户
mvc三层架构
上面写的代码实现了3部分功能,页面访问输用户需求内容用作交互,验证用户名用户密码是否正确,以及查寻数据库中的内容,这三部分的代码都堆在一起,日后如果有需要修改的地方是非常让人头疼的,于是我们引入了架构
最常见的mvc架构:
UI(表现层controller): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
BLL:(业务逻辑层service): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
DAL:(数据访问层dao): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
先给出目录图:
请忽略掉test,只是用来测试功能的
连接数据库以及创建构造器的工具类:JDBCUtil 之前有写过
(18条消息) jdbc 模拟增删查_zzds111的博客-CSDN博客
bean层
用来存储在数据库中查询到的用户信息,
我们在bean文件目录下创建User类, 在dao层查询到的数据会利用这个User类存储,方便在各层之间使用
import lombok.*;
//set,get方法,构造方法有参无参,toString方法
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User
{
private String userid;
private String username;
private String password;
}
数据访问层(持久层dao),负责数据库中的信息操作管理
我们这里就是通过传入的用户名,获取该用户在数据库里的所有信息
然后通过结果集中的getString方法获取用户信息,将信息通过User类的set方法传入user对象中,将user对象返回到service层判断。
import comshujia.spring.mvc.Until.JDBCUtil;
import comshujia.spring.mvc.bean.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
public User loginDao(String username){
//查询数据库,将查询到的信息存储 ->User(id,username,password)
//这里先将user定义为null,如果后面查询不到用户信息就返回空的user
User user = null;
try {
Connection conn = JDBCUtil.getConn();
PreparedStatement ps = JDBCUtil.getPs("select * from login1 where username=?");
ps.setString(1,username);
ResultSet rs = ps.executeQuery();
if(rs.next()){
//这里我们需要新创建一个user,因为上面的为空会报空指针异常
user = new User();
user.setUserid(rs.getString("userid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
}
// finally {
// JDBCUtil.closeAll();
// }
return user;
}
}
业务逻辑层service
我们在这一层的任务就是判断dao层返回的信息是否符合设置的逻辑规则,再将判断后的结果返回给表现层controll
所以先传需要传入用户名和密码两个参数
创建UserDao的对象,传入用户名,获取到存储该用户信息的user对象
如果这个对象是空的显示用户名不存在,查询到了内容再看看密码是否匹配
import comshujia.spring.mvc.bean.User;
import comshujia.spring.mvc.dao.UserDao;
//验证登录能否成功
public class UserService {
public String loginService(String username,String password){
UserDao userDao = new UserDao();
//验证用户是否存在
User user = userDao.loginDao(username);
if(user==null){
return "用户不存在";
}
if(!user.getPassword().equals(password)){
return "密码错误";
}
// 验证用户码是否正确
return "登录成功";
}
}
表现层controller
负责与前端的交互,用户可以输入用户名,密码等信息,并且返回一个操作结果进行展示
import comshujia.spring.mvc.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserConntroller {
@RequestMapping("/userlogin")
public String userlogin(String username,String password){
//登录成功还是失败需要业务逻辑层的验证
UserService userService = new UserService();
String message = userService.loginService(username,password);
return message;
}
}
演示:
这是我创建的数据表
运行application
输入正确的用户名和密码
输入正确的用户名和错误的密码
输入错误的用户名
避雷:我在上面的dao层连接数据库后,写了一个关闭连接
之后遇到的问题是,网页访问第一次正常,第二次开始就异常
这是因为我写的JDBC工具类,为了方便将连接驱动写在了静态代码块中,这样的后果就是只会连接一次驱动,我关闭了连接后,多次调用工具类是没有用的,static中的内容只会执行一次
为了观感直接写一个打印一个获取连接的字符串
我们再登录页面多刷新几次
控制台始终只会打印一次
更多推荐
所有评论(0)