朝阳博客

  • Article
  • Project
  • HTML+CSS
  • Bootstrap
  • JavaScript
  • jQuery
  • PHP
  • Java
  • Linux
  • MySQL
朝阳博客
一款专注于博客的响应式网站
  1. 首页
  2. 未分类
  3. 正文

使用 Spring Boot、MyBatis Plus、Mysql实现用户登录和"记住我"功能

2023年9月16日 217点热度 0人点赞 0条评论

这一系列课程将包含Springboot相关的各种功能实现及功能示例。

使用 Spring Boot、MyBatis Plus、Mysql实现用户登录和"记住我"功能

实现用户登录和"记住我"功能涉及到Spring Boot作为框架,MyBatis-Plus作为持久层框架,以及MySQL作为数据库。下面是一个简单的示例代码以及核心算法说明。

创建数据库表

首先,创建一个名为 rm_user 的数据库表,用于存储用户信息。

sql

CREATE TABLE rm_user (
id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, remember_token VARCHAR(100), UNIQUE KEY unique_username (username));

初始化管理员帐号

INSERT INTO `rm_user` (`id`, `username`, `password`, `remember_token`)
VALUES (1000, 'admin', '123456', NULL);

依赖配置:

dependencies>
dependency> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-webartifactId> dependency>

dependency> groupId>com.baomidougroupId> artifactId>mybatis-plus-boot-starterartifactId> version>3.4.3version> dependency>

dependency> groupId>mysqlgroupId> artifactId>mysql-connector-javaartifactId> dependency>dependencies>

application.properties配置:

# MySQL Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_namespring.datasource.username=your_database_usernamespring.datasource.password=your_database_passwordspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# MyBatis Plus Configurationmybatis-plus.configuration.map-underscore-to-camel-case=truemybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

创建 RmUser 实体类

创建一个名为 RmUser 的实体类,用于映射数据库表中的用户信息。

package com.icoderoad.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;

@Data@TableName("rm_user")public class RmUser { @TableId(type = IdType.AUTO) private Long id; private String username; private String password; private String rememberToken;}

创建 RmUserMapper

使用 MyBatis-Plus 创建一个 RmUserMapper 接口,用于数据库操作。

package com.icoderoad.example.demo.mapper;

import org.springframework.stereotype.Repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.icoderoad.example.demo.entity.RmUser;

@Repositorypublic interface RmUserMapper extends BaseMapper {}


创建 RmUserService

创建一个 RmUserService 类,处理用户登录和"记住我"功能。

package com.icoderoad.example.demo.service;


import java.util.UUID;

import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.util.StringUtils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.icoderoad.example.demo.entity.RmUser;import com.icoderoad.example.demo.mapper.RmUserMapper;

@Servicepublic class RmUserService {

@Autowired private RmUserMapper userMapper;

public boolean login(String username, String password, boolean rememberMe, HttpServletRequest request, HttpServletResponse response) { RmUser user = userMapper.selectOne(new QueryWrapper().eq("username", username)); if (user != null && user.getPassword().equals(password)) { // 登录成功 if (rememberMe) { // 生成一个随机的rememberToken String rememberToken = UUID.randomUUID().toString(); user.setRememberToken(rememberToken); userMapper.updateById(user);

// 将rememberToken存储到Cookie中 Cookie rememberMeCookie = new Cookie("rememberMe", rememberToken); rememberMeCookie.setMaxAge(7 * 24 * 60 * 60); // 设置Cookie有效期为7天 response.addCookie(rememberMeCookie); }

// 在Session中保存登录状态 request.getSession().setAttribute("user", user); return true; } return false; }

public void logout(HttpServletRequest request, HttpServletResponse response) { // 清除Session中的用户信息 request.getSession().removeAttribute("user");

// 清除记住我功能的Cookie Cookie rememberMeCookie = new Cookie("rememberMe", null); rememberMeCookie.setMaxAge(0); response.addCookie(rememberMeCookie); }

public RmUser getUserFromRememberMeCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("rememberMe".equals(cookie.getName())) { String rememberToken = cookie.getValue(); if (!StringUtils.isEmpty(rememberToken)) { return userMapper.selectOne(new QueryWrapper().eq("remember_token", rememberToken)); } } } } return null; }}

创建 RmUserController

创建一个 RmUserController 类,处理用户相关的HTTP请求。

package com.icoderoad.example.demo.controller;


import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;

import com.icoderoad.example.demo.entity.RmUser;import com.icoderoad.example.demo.service.RmUserService;

@Controller@RequestMapping("/rm")public class RmUserController {

@Autowired private RmUserService userService;

@GetMapping("/login") public String loginPage( HttpServletRequest request ) { RmUser user = (RmUser) request.getSession().getAttribute("user"); if (user == null) { user = userService.getUserFromRememberMeCookie(request); }

if( user !=null ) { return "redirect:/rm/dashboard"; } return "rm/login"; }

@PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password, @RequestParam(required = false) boolean rememberMe, HttpServletRequest request, HttpServletResponse response, Model model) { boolean loginResult = userService.login(username, password, rememberMe, request, response); if (loginResult) { return "redirect:/rm/dashboard"; } else { model.addAttribute("error", "Invalid username or password"); return "login"; } }

@GetMapping("/logout") public String logout(HttpServletRequest request, HttpServletResponse response) { userService.logout(request, response); return "redirect:/rm/login"; }

@GetMapping("/dashboard") public String dashboard(HttpServletRequest request, Model model) { RmUser user = (RmUser) request.getSession().getAttribute("user"); if (user == null) { user = userService.getUserFromRememberMeCookie(request); } if (user != null) { model.addAttribute("user", user); return "rm/dashboard"; } else { return "redirect:/rm/login"; } }}

创建登录页面和仪表盘页面

在resources/templates/rm 目录下创建login.html和dashboard.html,分别用于登录页面和仪表盘页面的展示。

以下是login.html和dashboard.html的基本代码框架和描述:

login.html


html lang="zh-CN">head> meta charset="UTF-8"> meta name="viewport" content="width=device-width, initial-scale=1.0"> title>用户登录title>head>body> h1>用户登录h1> form action="/rm/login" method="post"> label for="username">用户名:label> input type="text" id="username" name="username" required>br>

label for="password">密码:label> input type="password" id="password" name="password" required>br>

label for="rememberMe">记住我:label> input type="checkbox" id="rememberMe" name="rememberMe">br>

input type="submit" value="登录"> form>body>html>

dashboard.html


html lang="zh-CN">head> meta charset="UTF-8"> meta name="viewport" content="width=device-width, initial-scale=1.0"> title>用户仪表盘title>head>body> h1>欢迎来到仪表盘h1> div> p>你好,span th:text="${user.username}">span>!p> a href="/rm/logout">注销a> div>body>html>

以上代码示例演示了一个简单的用户登录和"记住我"功能的实现,核心算法包括:

用户登录验证:在UserService中,通过查询数据库验证用户提供的用户名和密码是否匹配。

"记住我"功能:通过随机生成一个rememberToken,将其存储到用户表中,并将该rememberToken存储到Cookie中,以便用户下次访问时免登录。

用户登出:清除Session中的用户信息并删除"记住我"功能的Cookie。

自动登录:从Cookie中获取rememberToken,查询数据库获取用户信息,实现自动登录。

示例中完整代码,可以从 https://github.com/icoderoad/wxdemo.git 下载获取。

今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码关注公众号。也可以添加 happyzjp 微信受邀加入学习社群,我们会尽力为你解答。练习网站已经正式上线,大家可以登陆网站 http://www.icoderoad.com 进行文章中示例的练习。

作者:路条编程(转载请获本公众号授权,并注明作者与出处)


标签: 暂无
最后更新:2023年9月16日

aiyao

你要加油,你喜欢的人还没结婚。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2021 zhaoyangweb.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

冀ICP备2021020018号-1