本文记录用SpringBoot 实现简单的用户登录过程,对于初步入门的我来说遇到了很多的困难,所以在实现登录后特写此篇文章。描述我在实现过程中遇到的问题和疑惑,也算是自己的学习笔记吧!!
开发环境:
- IDE:JetBrains Intelij IDEA
- Java:JavaSE13
- SpringBoot + xadmin + Layui +Mybatis + MySQL
详细过程:
文件目录:
实现用户登录功能用到的目录已经标出:
- 【domain】目录主要用于实体(Entity)与数据访问层(Repository)控制
- 【service 】层主要是业务类代码
- 【controller 】负责页面访问控制
- 【dao】数据库访问层
- 【entity】实体层(这里没有)
设置和连接数据库:
建立数据库
在Navicat中建立一个数据库,并建立一张用户表(用来存储要登录的用户)
用户登录主要用到下面这张user表,这里事先输入了用户名和密码。
设置application.properties文件
然后,打开SpringBoot项目的application.properties文件,配置如下信息:
# 数据库的连接驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接数据库的地址,注意端口和要连接的数据库名,后面设置时区,不然可能会报错
spring.datasource.url=jdbc:mysql://localhost:3306/database-manager?serverTimezone=UTC
# 连接的账号和密码,根据自己情况
spring.datasource.username=root
spring.datasource.password=123456
# 下面关于mybatis的要设置,不然会报错,读取不了数据库数据。
# mapper xml文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
# 实体类别名
mybatis.type-aliases-package=pinksmile.database.domin
# 开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
# 将日志输出到控制台
mybatis.configuration.logImpl=org.apache.ibatis.logging.stdout.StdOutImpl
# 这个开发配置为false,避免改了模板还要重启服务器
spring.thymeleaf.cache=false
然后,用IDEA连接数据库:
使用Mybatis操作数据库
配置数据库数据操作UserMapper.xml文件:注意与dao层和domain层关联。
需要注意的地方下面已经标出(网上有文章介绍):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--author PinkSmile 用户表-->
<mapper namespace="pinksmile.database.dao.UserDao">
<resultMap id="UserMap" type="pinksmile.database.domain.User">
<result column="id" javaType="Integer" jdbcType="INTEGER" property="id"/>
<result column="nickname" javaType="String" jdbcType="VARCHAR" property="nickname"/>
<result column="username" javaType="String" jdbcType="VARCHAR" property="username"/>
<result column="password" javaType="String" jdbcType="VARCHAR" property="password"/>
<result column="permission" javaType="String" jdbcType="VARCHAR" property="permission"/>
<result column="role" javaType="String" jdbcType="VARCHAR" property="role"/>
</resultMap>
<!--通过用户名和密码从表中获得用户-->
<select id="login" resultType="pinksmile.database.domain.User">
select * from user where username = #{username} and password = #{password}
</select>
<!--通过用户id获得用户角色-->
<select id="getUserRoleByID" resultType="String">
select role from user where id = #{userId}
</select>
</mapper>
至此,关于数据库的部分已经配置完成。下面写代码部分。
准备页面:
templates目录下:
- login.html 登录页面
- index.html 登录后普通用户跳转的页面
- manage.html 登录后管理员跳转的页面
各层文件及作用
首先是【domain】中的User.java,用作数据库表的映射,描述数据库中表的信息:
该文件要注意的是下载 lombok 依赖,使用IDEA的拓展插件即可完成,方法可参考网上。
package pinksmile.database.domain;
import lombok.Data;
/**
* 登录的用户表
* @author PinkSmile
*/
@Data
public class User {
/**
* 数据库用户标的字段
* 保证字段和数据类型一致
*/
private Integer id;
private String nickname;
private String username;
private String password;
private String permission;
private String role;
}
【dao】层数据库接口:
该层的函数接口和前面配置UserMapper.xml文件有关,此文件是提供接口,而那个配置文件是实现该接口的功能。
package pinksmile.database.dao;
import org.springframework.stereotype.Repository;
import pinksmile.database.domain.User;
@Repository // 这是mybatis操作的数据库
public interface UserDao {
// 根据用户名和密码获得用户信息
User login(String username, String password);
// 根据用户 id 获取用户角色
String getUserRoleByID(Integer userId);
}
【service】业务逻辑编写
在初始化数据库环境,定义数据库访问接口后,下面就是业务逻辑的编写。
package pinksmile.database.service;
import org.springframework.data.relational.core.sql.In;
import pinksmile.database.dao.UserDao;
import pinksmile.database.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserDao userDao;
// 根据用户名和密码登录
public User login(String username, String password) {
return userDao.login(username, password);
}
// 通过用户ID得到用户角色
public String getUserRoleByID(Integer userId) {return userDao.getUserRoleByID(userId);}
}
【controller】负责页面访问控制
该层是最麻烦的一层,负责页面的跳转和页面的各种活动。
首先是登录页面控制
注意:区分网址和网站页面的使用,一开始我都没搞清楚。每一个页面都对应一个网址。
业务逻辑:
- 输入网址
http://localhost:8080/login
进入的是登录页面,也就是我们写的login.html前端页面。 - 如果已经登录,就重定向跳转到管理界面
http://localhost:8080/manage
,根据不同的用户角色跳转到不同界面 - 如果没有登录,就返回登录页面。
- 在登录是否成功时,失败页面的网址为
http://localhost:8080/manage/verification
,但显示的页面仍然是登录页面。 - 如果登录判断成功,就跳转到管理页面。
BackManage.java
实现功能:
- 管理页面和网址的映射,对登录后的页面进行跳转
package pinksmile.database.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import pinksmile.database.domain.User;
import pinksmile.database.service.UserService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class BackManage {
@Autowired
UserService userService;
/**
* 后台管理页面数据准备接口
* @param request 用于获取Session来判断是否登录
* @return 返回模板页面
*/
@GetMapping("/manage") // 管理页面网址
public String manage(HttpServletRequest request){
HttpSession session=request.getSession(); // 获取登录信息
Object obj = session.getAttribute("user");
// 没有登录,返回登录页面
if(obj == null){ // 登录信息为 null,表示没有登录
return "redirect:/login";
}
User loginUser = (User) obj; // 强制转换成 User
Integer userId = loginUser.getId(); // 获得登录用户的 id
String role = userService.getUserRoleByID(userId); // 通过登录用户的 id 得到用户的角色
// 如果是用户登录,返回用户界面
if (role.equals("user")){
return "index";
}
// 如果是管理员登录就返回管理页面
return "manage";
}
@GetMapping("/welcome")
public String toWelcome() {return "welcome";}
}
Login.java:
实现功能:
- 从数据库获取密码进行登录
- 每到达登录页面就判断是否短时间内已经登陆过,登陆过就直接跳转到页面
package pinksmile.database.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import pinksmile.database.domain.User;
import pinksmile.database.service.UserService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class Login {
@Autowired
UserService userService;
/**
* 用于返回登录页面
* @param request 判断是否已经登录,已经登录就直接跳转
* @return 返回登录页面模板
*/
@GetMapping("/login") // 登录页面网址
public String login(HttpServletRequest request) {
HttpSession session = request.getSession(); // 获取用户登录信息
// 如果已经登录,则重定向直接跳转到判断界面
if (session.getAttribute("user") != null) {
return "redirect:/manage";
}
// 如果没有登录信息,则直接返回登录页面
return "login";
}
/**
* 用于验证账号和密码是否正确
*
* @param username 账号信息
* @param password 密码信息
* @param request 用于获取Session
* @return 登录成功跳转管理界面,失败返回错误信息到登录页面
*/
@PostMapping("/manage/verification") // 失败错误信息页面网址
public String verification(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpServletRequest request) {
if (username.equals("") || password.equals("")) { // 密码为空,重新登录
return "login";
} else {
User user = userService.login(username, password); // 从数据库中获得与输入相同的用户
if (user == null) { // 没有该用户
return "login";
}
// 创建 session
HttpSession session = request.getSession();
session.setAttribute("user", user);
}
return "redirect:/manage"; // 登录成功进行页面选择跳转
}
}
运行结果:
普通用户登录到后台管理页面:
已经登录后,再登录直接重定向到管理页面: