—— 本文转自onestar :【SpringBoot搭建个人博客】- 后台登录(四)

本文将从MVC架构、MD5加密、登录拦截器来讲述个人博客系统的后台登录实现

MVC架构

后台开发采用的是MVC架构,MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:

Model(模型):
通常指的是我们的数据模型,一般情况下用于封装数据

View(视图):
通常指 jsp 或者 html,一般用于展示数据,通常视图是依据模型数据创建的

Controller(控制器):
应用程序中处理用户交互的部分,一般用于处理程序逻辑的

1.用户实体类

之前提到过,由于是个人博客,就没有做权限管理,只是简单的区分了一下管理员(栈主)和普通用户,所以这里需要用户实体类,并需要基本的用户名和密码,管理员登录后可以对后台进行操作,而普通用户则没有权限,在com.star(Group组名)目录下创建entity包,并创建User实体类,实体类如下(这里省去了get、set、toString方法):

package com.star.entity;import java.util.Date;/*** @Description: 用户实体类*/
public class User {private Long id;private String nickname;private String username;private String password;private String email;private String avatar;private Integer type;private Date createTime;private Date updateTime;}

2.MD5加密

由于后面要用到MD5加密,对登录密码进行加密,这里就先进行处理一下,在com.star包下创建util工具包,用来放工具类,创建MD5Utils工具类,如下:

package com.star.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/*** @Description: MD5加密工具类*/
public class MD5Utils {/*** @Description: MD5加密*/public static String code(String str){try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(str.getBytes());byte[]byteDigest = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < byteDigest.length; offset++) {i = byteDigest[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}//32位加密return buf.toString();// 16位的加密//return buf.toString().substring(8, 24);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}public static void main(String[] args) {System.out.println(code("111111"));}}

分析:

通过该工具类,可以获取密码,在main函数中输入自己密码对应的明码,然后运行,可以在控制台获取对应的密码,这个密码是要存储在数据库中的password字段
eg:这里是"111111"字符串,运行main后,获得密码为:“96e79218965eb72c92a549dd5a330112”,则将该字符串存储进数据库中

3.持久层接口
在com.star目录下创建dao包,创建用户持久层接口UserDao,这里主要查询用户名和密码,通过@Param注解将参数传递给SQL,代码如下:

package com.star.dao;import com.star.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;/*** @Description: 用户持久层接口*/
@Mapper
@Repository
public interface UserDao {/*** @Description:* @Param: username:用户名;password:密码* @Return: 返回用户对象*/User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}

分析:

@Mapper注解:让Mybatis找到对应的mapper,在编译的时候动态生成代理类,实现相应SQL功能
@Repository注解:用来声明dao层的bean(这个注解可有可无,可以消去依赖注入的报错信息)【@Mapper和@Repository注解可以参考这篇文章:Mybatis 中的 @Repository 与 @Mapper】
@Param注解:将参数传递给SQL
返回一个User对象给service调用并核对用户名和密码

4.mapper
Mybatis使用XMLMMapperBuilder类的实例来解析mapper配置文件并执行SQL语句,在resources目录下创建mapper文件夹,再创建UserDao.xml文件,如下:

<?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" >
<mapper namespace="com.star.dao.UserDao"><!--查询用户名和密码--><select id="findByUsernameAndPassword" resultType="com.star.entity.User">select * from myblog.t_userwhere username = #{username} and password = #{password};</select></mapper>

5.用户业务层
在com.star目录下创建service包,创建用户业务层接口UserService,这里主要是检验用户名和密码,传递用户名和密码两个参数,代码如下:

package com.star.service;import com.star.entity.User;
/*** @Description: 用户业务层接口*/
public interface UserService {//核对用户名和密码User checkUser(String username, String password);
}

用户层接口实现类:

在service包下创建Impl包,用来放接口实现类,UserServiceImpl代码如下:

package com.star.service.Impl;import com.star.dao.UserDao;
import com.star.entity.User;
import com.star.service.UserService;
import com.star.util.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @Description: 用户业务层接口实现类*/
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;/*** @Description:* @Param: username:用户名;password:密码* @Return: 返回用户对象*/@Overridepublic User checkUser(String username, String password) {User user = userDao.findByUsernameAndPassword(username, MD5Utils.code(password));return user;}
}

分析:

这里主要是获取数据库中的用户名和密码,通过控制器传递过来的密码进行解析匹配,匹配成功则登录

6.登录控制器
在controller控制器包下创建admin包,用来放用户管理的控制器,创建LoginController用户登录控制器,在这里进行登录跳转、登录校验、注销功能,代码如下:

package com.star.controller.admin;import com.star.entity.User;
import com.star.service.UserService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import javax.servlet.http.HttpSession;/*** @Description: 用户登录控制器*/
@Controller
@RequestMapping("/admin")
public class LoginController {@Autowiredprivate UserService userService;/*** @Description: 跳转登录页面* @Param:* @Return: 返回登录页面*/@GetMappingpublic String loginPage(){return "admin/login";}/*** @Description: 登录校验* @Param: username:用户名* @Param: password:密码* @Param: session:session域* @Param: attributes:返回页面消息* @Return: 登录成功跳转登录成功页面,登录失败返回登录页面*/@PostMapping("/login")public String login(@RequestParam String username,@RequestParam String password,HttpSession session,RedirectAttributes attributes) {User user = userService.checkUser(username, password);if (user != null) {user.setPassword(null);session.setAttribute("user",user);return "admin/index";} else {attributes.addFlashAttribute("message", "用户名和密码错误");return "redirect:/admin";}}/*** @Description: 注销* @Param: session:session域* @Return: 返回登录页面*/@GetMapping("/logout")public String logout(HttpSession session) {session.removeAttribute("user");return "redirect:/admin";}
}

分析:

@RequestMapping注解:映射请求路径
登录校验:将前端传递过来的用户名和密码给service进行检验核对,并放入session域中(session是全局的,登录后访问其他页面或者重开页面也是登录状态)
登录成功跳转后台管理页面,失败则跳转登录页面
登录成功后可以进行注销,注销后返回登录页面
运行代码,访问:http://localhost:8080/admin/ ,输入用户名和密码,这里要注意先将密码进行MD5加密,将加密后的字符串存储进数据库。如下,登录成功,跳转到了后台管理页面

前端直接用thymeleaf模板处理,不做解说

7.登录拦截器

在没有登录的情况下,不能让游客访问到后台管理页面,在这里就需要加一个登录拦截器,将访问路径给过滤掉,这里就用SpringBoot里面内置的interceptor,在com.star包下新建interceptor包,创建LoginInterceptor登录过滤拦截器,继承HandlerInterceptorAdapter适配器,重写预处理方法,进行拦截,如下:

拦截器:

package com.star.interceptor;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @Description: 登录过滤拦截*/
public class LoginInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {//        判断session里面是否有用户,没有的话重定向到登录页面,给拦截掉if (request.getSession().getAttribute("user") == null) {response.sendRedirect("/admin");return false;}return true;}
}

分析:

继承HandlerInterceptorAdapter适配器,重写预处理方法preHandle
对session进行判断,看是否有用户,没有的话重定向到登录页面,给拦截掉
还需要指定拦截的内容
指定拦截内容:

同级包下新建WebConfig配置类,继承WebMvcConfigurerAdapter配置,重写addInterceptors过滤设置,如下:

package com.star.interceptor;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** @Description: 指定拦截内容的配置类*/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor())//过滤的路径.addPathPatterns("/admin/**").excludePathPatterns("/admin").excludePathPatterns("/admin/login");}
}

分析:

@Configuration注解:表明是一个有效的配置类
重写addInterceptors方法
指定要拦截的路径,这里拦截"admin"访问路径
拦截器完成

按照MVC架构开发,后端MVC架构目录结构如下

Spring Boot 开发个人博客--后台登录相关推荐

  1. halo java_Halo - 轻快,简洁,功能强大,使用Spring Boot开发的博客系统

    Halo 是一款现代化的个人独立博客系统,给习惯写博客的同学多一个选择. 简介 Halo [ˈheɪloʊ],意为光环.当然,你也可以当成拼音读(哈喽). 一个优秀的开源博客发布应用,值得一试. 声明 ...

  2. Spring boot 搭建个人博客系统(二)——登录注册功能

    Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...

  3. 基于Spring Boot的个人博客系统(源码+数据库)

    目录 一.系统功能框架图 二.开发技术 三.开发环境 四.页面展示 1.登录页面 2.首页 3.文章详情页面 4.文章评论页面 ​5.后台页面 6.后台文件编辑页面 ​7.后台文章管理列表页面 五.文 ...

  4. 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)

    零.说明(必读) 一.课程概述 1.1 名称 1.2 功能 1.3 技术点 1.4 目标 二.核心功能 2.1 用户管理 2.2 安全设置 2.3 博客管理 2.4 评论管理 2.5 点赞管理 2.6 ...

  5. 基于Spring Boot的个人博客系统的设计与实现毕业设计源码271611

    目  录 摘要 1 绪论 1.1研究意义 1.2开发背景 1.3系统开发技术的特色 1.4论文结构与章节安排 2个人博客系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 ...

  6. Spring Boot制作个人博客-后端管理(登录)

    文章目录 一.构建页面 1.构建登录页面 2.构建后台管理页面 3.复制_fragments 二.实现登录 1.创建用户接口 2.创建用户实现类 3.创建UserRepository 4.初始化一个用 ...

  7. spring boot+vue个人博客七:打包部署,多节点部署方案

    系列大纲 GitHub(还没开发完成) 在线演示www.yzpnb.top 第一章:(后端)搭建spring boot脚手架:https://blog.csdn.net/grd_java/articl ...

  8. 基于 Spring Boot 的个人博客系统设计与实现(源码+数据库+42页论文)

    目录 若下载链接失效,请私信我:或加vx(grzyfun)发送资源 1.选题来源 2.项目背景 3.可行性分析 4.数据字典 5.开发环境介绍 6.数据库设计 7.界面展示 8.测试 9.文档目录,计 ...

  9. 【备忘】Spring Boot技术栈博客企业前后端

    第1章 Spring Boot 简介     第2章 开启 Spring Boot 的第一个 Web 项目     第3章 一个Hello World项目     第4章 开发环境的搭建     第5 ...

最新文章

  1. 火狐推荐几个实用的插件
  2. 静态路由实验 +http+dns_华为静态路由配置实验
  3. 原理分析_生化分析仪原理结构及参数对比
  4. SpringCloud Ribbon(二)之自定义负载均衡策略IRule
  5. 前端学习(2975):路由传参的两种方式
  6. 12306能删候补订单记录_12306候补购票功能在哪里怎么用 火车票候补购票使用攻略...
  7. html 基本布局介绍
  8. 今天提交了一个patch开心,呵呵
  9. php考过来运行后报乱码,PHP接收GET中文参数乱码怎么办
  10. 设计自己的线程局部存储
  11. java byte 文件大小_java byte文件大小
  12. 【2016阿里安全峰会】“安全攻防”烧脑博弈全解读【附PDF下载】
  13. 思维题:三个箱子,一个只装苹果,一个只装橙,另一个装苹果和橙,请问?
  14. 【高等数学笔记】二元函数连续、可微、偏导数存在、偏导数连续、任意方向导数存在的关系
  15. Android带数字拼音与带音标拼音互转工具类
  16. 想要快乐陪伴左右吗?多种提高多巴胺的方法送给你
  17. Keil MDK 安装pack包
  18. 前端开发第三方分享/登录功能备忘(facebook、weibo、QQ、weixin微信好友或者朋友圈)
  19. 一个汉字包括几个字符,几个字节?一个字母呢?
  20. cydia java_使用Cydia Substrate 从Native Hook Android Java世界

热门文章

  1. TCP/IP常见面试问题
  2. Puma560机器人运动学正逆解
  3. 原码、反码、补码都是有符号定点数的表示方法。
  4. 玩转工作,升值加薪,担任总经理,出任CEO,走向人生巅峰!
  5. CocosCreator 源码-index.js讲解
  6. python贝叶斯优化算法_自动调参——贝叶斯优化算法hyperopt
  7. 【实习小tip】elementUI表格数值加减和实时计算、导出数据并解决手机号科学计数法格式问题、git clone报错:OpenSSL SSL_connect: SSL_ERROR_SYSCALL
  8. C# reportview页边距(左右上下边距设置)的方法
  9. AutoCAD Electrical 2022—项目的配置描述文件
  10. Stripe支付 ios