SpringBoot:实现用户根据角色登录不同的页面

本文记录用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";             // 登录成功进行页面选择跳转
    }
}

运行结果:

普通用户登录到后台管理页面
在这里插入图片描述
已经登录后,再登录直接重定向到管理页面:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章