Spring Boot 开发个人博客--后台登录
—— 本文转自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 开发个人博客--后台登录相关推荐
- halo java_Halo - 轻快,简洁,功能强大,使用Spring Boot开发的博客系统
Halo 是一款现代化的个人独立博客系统,给习惯写博客的同学多一个选择. 简介 Halo [ˈheɪloʊ],意为光环.当然,你也可以当成拼音读(哈喽). 一个优秀的开源博客发布应用,值得一试. 声明 ...
- Spring boot 搭建个人博客系统(二)——登录注册功能
Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...
- 基于Spring Boot的个人博客系统(源码+数据库)
目录 一.系统功能框架图 二.开发技术 三.开发环境 四.页面展示 1.登录页面 2.首页 3.文章详情页面 4.文章评论页面 5.后台页面 6.后台文件编辑页面 7.后台文章管理列表页面 五.文 ...
- 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)
零.说明(必读) 一.课程概述 1.1 名称 1.2 功能 1.3 技术点 1.4 目标 二.核心功能 2.1 用户管理 2.2 安全设置 2.3 博客管理 2.4 评论管理 2.5 点赞管理 2.6 ...
- 基于Spring Boot的个人博客系统的设计与实现毕业设计源码271611
目 录 摘要 1 绪论 1.1研究意义 1.2开发背景 1.3系统开发技术的特色 1.4论文结构与章节安排 2个人博客系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 ...
- Spring Boot制作个人博客-后端管理(登录)
文章目录 一.构建页面 1.构建登录页面 2.构建后台管理页面 3.复制_fragments 二.实现登录 1.创建用户接口 2.创建用户实现类 3.创建UserRepository 4.初始化一个用 ...
- spring boot+vue个人博客七:打包部署,多节点部署方案
系列大纲 GitHub(还没开发完成) 在线演示www.yzpnb.top 第一章:(后端)搭建spring boot脚手架:https://blog.csdn.net/grd_java/articl ...
- 基于 Spring Boot 的个人博客系统设计与实现(源码+数据库+42页论文)
目录 若下载链接失效,请私信我:或加vx(grzyfun)发送资源 1.选题来源 2.项目背景 3.可行性分析 4.数据字典 5.开发环境介绍 6.数据库设计 7.界面展示 8.测试 9.文档目录,计 ...
- 【备忘】Spring Boot技术栈博客企业前后端
第1章 Spring Boot 简介 第2章 开启 Spring Boot 的第一个 Web 项目 第3章 一个Hello World项目 第4章 开发环境的搭建 第5 ...
最新文章
- 火狐推荐几个实用的插件
- 静态路由实验 +http+dns_华为静态路由配置实验
- 原理分析_生化分析仪原理结构及参数对比
- SpringCloud Ribbon(二)之自定义负载均衡策略IRule
- 前端学习(2975):路由传参的两种方式
- 12306能删候补订单记录_12306候补购票功能在哪里怎么用 火车票候补购票使用攻略...
- html 基本布局介绍
- 今天提交了一个patch开心,呵呵
- php考过来运行后报乱码,PHP接收GET中文参数乱码怎么办
- 设计自己的线程局部存储
- java byte 文件大小_java byte文件大小
- 【2016阿里安全峰会】“安全攻防”烧脑博弈全解读【附PDF下载】
- 思维题:三个箱子,一个只装苹果,一个只装橙,另一个装苹果和橙,请问?
- 【高等数学笔记】二元函数连续、可微、偏导数存在、偏导数连续、任意方向导数存在的关系
- Android带数字拼音与带音标拼音互转工具类
- 想要快乐陪伴左右吗?多种提高多巴胺的方法送给你
- Keil MDK 安装pack包
- 前端开发第三方分享/登录功能备忘(facebook、weibo、QQ、weixin微信好友或者朋友圈)
- 一个汉字包括几个字符,几个字节?一个字母呢?
- cydia java_使用Cydia Substrate 从Native Hook Android Java世界
热门文章
- TCP/IP常见面试问题
- Puma560机器人运动学正逆解
- 原码、反码、补码都是有符号定点数的表示方法。
- 玩转工作,升值加薪,担任总经理,出任CEO,走向人生巅峰!
- CocosCreator 源码-index.js讲解
- python贝叶斯优化算法_自动调参——贝叶斯优化算法hyperopt
- 【实习小tip】elementUI表格数值加减和实时计算、导出数据并解决手机号科学计数法格式问题、git clone报错:OpenSSL SSL_connect: SSL_ERROR_SYSCALL
- C# reportview页边距(左右上下边距设置)的方法
- AutoCAD Electrical 2022—项目的配置描述文件
- Stripe支付 ios