简介:这是一套面向Java后端开发者与计算机专业学生的完整网站后台管理系统源码,基于Spring Boot、MyBatis、Spring MVC、Spring Security与Redis构建,适合希望掌握企业级Web开发技术栈、理解各组件协同工作的中高级学习者。项目以Spring Boot快速搭建并内置Tomcat,MyBatis负责持久层SQL映射,Spring MVC实现模型-视图-控制器分层,Spring Security承担登录认证、权限控制与CSRF防护,Redis则用于数据缓存与异步处理,整体覆盖数据库操作、Web交互、安全防护与性能优化等核心场景。压缩包共326个文件,约1.76MB,包含95个Java源码、45个JavaScript脚本、33个HTML页面、19个CSS样式及12个XML配置,另有SQL脚本、YAML配置与字体图标资源,前端界面与后端逻辑配套齐全。目前已有958人学习下载,可作为课程设计、毕业设计或自学练手的参考项目,帮助读者梳理分层架构、安全配置与缓存集成的实现思路。
1. 从一次“能启动但登不进去”的部署说起
后台管理系统这套东西,装过的人都知道,最玄学的不是代码写错,而是环境明明跑起来了,登录页却一直转圈,或者登录成功之后立刻被踢回登录页。我见过太多人卡在 Spring Security 和 Redis 的联动上,明明 SpringBoot 启动日志干干净净,MyBatis 也能连上库,SpringMVC 的接口也能访问,偏偏就是认证过不去。这套基于 SpringBoot + MyBatis + SpringMVC + Spring Security + Redis 的完整网站后台管理系统,本质上是一个典型的“多组件协同”项目,任何一个环节版本对不上,都会让你在登录页反复怀疑人生。它适合正在学企业级后台开发、需要一套能跑通认证授权全链路的开发者,也适合想拿它当脚手架改造成自己项目的熟手。装之前先把环境列清楚,比装完再回头查依赖省事得多。
2. 环境准备:版本选型与依赖清单
2.1 JDK 与构建工具的版本取舍
这套项目对 JDK 版本比较敏感。SpringBoot 2.x 系列主流搭配 JDK 8 或 JDK 11,我一般会选 JDK 8,因为 Spring Security 5.x 在 JDK 8 上最稳,JDK 11 也能跑,但部分老版本的 MyBatis 分页插件在 JDK 11 下会有反射相关的警告。如果你拿到的项目 pom.xml 里 spring-boot-starter-parent 是 2.3.x 到 2.7.x 之间,JDK 8 基本不会翻车。构建工具用 Maven 3.6+,别用 3.8 以下的版本,否则依赖解析偶尔会出问题。
# 检查 JDK 版本,确认输出是 1.8 或 11 java -version # 检查 Maven 版本,建议 3.6.3 以上 mvn -vjava -version看的是运行时版本,mvn -v除了看 Maven 自身版本,还会顺带输出它使用的 JDK 版本,这两个地方要一致。常见坑是系统里装了多个 JDK,JAVA_HOME 指向了 17,但项目编译目标是 8,结果启动时报 Unsupported class file major version。
2.2 MySQL 与 Redis 的安装参数
MySQL 建议 5.7 或 8.0,两个版本在 SQL 语法上差异不大,但 8.0 的默认认证插件是 caching_sha2_password,老版本的 JDBC 驱动连不上。如果你用 MySQL 8.0,要么升级 mysql-connector-java 到 8.0.x,要么在创建用户时指定 mysql_native_password。Redis 用 5.0 或 6.0 都行,Windows 上可以用 Redis 的 Windows 移植版,Linux 上直接 apt 或 yum 装。
# MySQL 8.0 创建用户时指定认证插件,避免驱动不兼容 CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; GRANT ALL PRIVILEGES ON 数据库名.* TO 'admin'@'%'; FLUSH PRIVILEGES; # Redis 启动后检查连通性 redis-cli ping # 返回 PONG 说明正常MySQL 建库时字符集用 utf8mb4,排序规则用 utf8mb4_general_ci,别用 utf8,否则存 emoji 或者某些特殊字符会报错。Redis 默认没有密码,本地开发够用,但如果要放到测试环境,记得在 redis.conf 里设 requirepass,同时 SpringBoot 的配置文件里也要同步改。
2.3 依赖清单对照表
| 组件 | 推荐版本 | 最低版本 | 备注 |
|---|---|---|---|
| JDK | 1.8 | 1.8 | JDK 11 也可,但需注意反射警告 |
| Maven | 3.6.3 | 3.5.0 | 低于 3.5 依赖解析可能异常 |
| MySQL | 5.7 / 8.0 | 5.6 | 8.0 需注意认证插件 |
| Redis | 5.0 | 4.0 | 需支持 Spring Data Redis 2.x |
| SpringBoot | 2.3.x - 2.7.x | 2.1.x | 与 Spring Security 5.x 配套 |
这张表里的版本不是随便写的,SpringBoot 2.3 以下对 Spring Security 的配置方式还是老式的 WebSecurityConfigurerAdapter,2.3 以上开始支持 Lambda DSL,项目里如果用了新写法,SpringBoot 版本就不能太低。Redis 版本低于 4.0 的话,Spring Data Redis 的一些连接池配置会不生效。
3. 安装与配置:从拉取代码到跑通登录
3.1 数据库初始化与 MyBatis 映射检查
拿到项目后第一件事不是急着 mvn spring-boot:run,而是先把数据库建好、表导进去。项目里一般会有 sql 目录,里面放着建表语句和初始数据。导入之后要检查 MyBatis 的 mapper 文件路径和实体类包名是否对得上。
# application.yml 中 MyBatis 相关配置 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.system.entity configuration: map-underscore-to-camel-case: truemapper-locations指向 XML 映射文件的位置,如果项目用的是注解方式写 SQL,这一行可以不要。type-aliases-package是实体类的包路径,配错了会在启动时报“找不到类型别名”。map-underscore-to-camel-case这个参数我强烈建议打开,数据库字段用下划线命名、Java 属性用驼峰命名时,它能自动映射,省掉大量 resultMap 配置。常见坑是 mapper XML 里的 namespace 写错,或者 SQL 的 resultType 写成了不存在的类,启动时不一定报错,但查询时会抛异常。
3.2 Spring Security 认证链路配置
Spring Security 是这套系统里最容易配错的部分。核心是要让它知道:哪些路径放行、哪些路径需要认证、登录逻辑走哪个接口、密码怎么加密。
// 典型的安全配置类片段 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login", "/css/**", "/js/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginProcessingUrl("/doLogin") .successHandler(自定义成功处理器) .failureHandler(自定义失败处理器) .and() .csrf().disable(); } }antMatchers里放的是不需要登录就能访问的路径,静态资源和登录页必须放行,否则你连登录页都打不开。loginProcessingUrl是表单提交的地址,前端 form 的 action 要跟它一致。successHandler和failureHandler一般项目里会自定义,用来返回 JSON 而不是重定向。csrf().disable()在前后端分离或者用 Token 认证的场景下通常要关掉,否则 POST 请求会被拦截。这里有个血泪经验:如果登录成功但立刻跳回登录页,八成是 Session 没存住,或者 Redis 里存的认证信息过期时间设得太短。
3.3 Redis 会话存储与序列化配置
这套系统用 Redis 存 Session 或者 Token,好处是重启服务不掉登录状态,坏处是序列化配错会报一堆看不懂的错。
// Redis 序列化配置,避免存进去是乱码 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // key 用 String 序列化 template.setKeySerializer(new StringRedisSerializer()); // value 用 Jackson 序列化,方便排查 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; }如果不配序列化,默认用 JDK 序列化,存到 Redis 里的 key 会带一堆二进制前缀,用 redis-cli 看的时候全是乱码,排查问题非常痛苦。用 StringRedisSerializer 处理 key,用 Jackson 处理 value,这样在 redis-cli 里能直接看懂存了什么。另一个坑是 Session 的过期时间,Spring Security 默认 Session 30 分钟过期,如果 Redis 里也设了 TTL,两边要协调好,否则会出现“Redis 里还有数据但 Session 已失效”的情况。
3.4 启动参数与配置文件覆盖
项目一般会有 application.yml、application-dev.yml、application-prod.yml 几个配置文件。本地跑用 dev 就行,启动时指定 profile。
# 指定 dev 环境启动 mvn spring-boot:run -Dspring-boot.run.profiles=dev # 或者打包后用 java -jar 启动 mvn clean package -DskipTests java -jar target/项目名.jar --spring.profiles.active=dev-DskipTests在打包时跳过测试,第一次跑建议加上,因为测试用例可能依赖一些本地没有的环境。--spring.profiles.active=dev是运行时指定配置文件,优先级比配置文件里的 spring.profiles.active 高。常见坑是数据库密码写在 application.yml 里,但 dev 配置文件里又覆盖了一遍,结果连不上库,这时候要看启动日志里最终生效的配置项。
4. 避坑排查:登录失败与启动异常的常见原因
4.1 现象:启动报错 “Error creating bean with name 'securityConfig'”
原因通常是 Spring Security 的配置类里注入了一个找不到的 Bean,比如自定义的 UserDetailsService 没加 @Service 注解,或者密码编码器 Bean 没定义。解决方法是检查配置类里所有 @Autowired 的字段,确认对应的 Bean 已经注册到容器里。我一般会在启动日志里搜 “NoSuchBeanDefinitionException”,它能直接告诉你缺哪个 Bean。
4.2 现象:登录页能打开,提交后 403
原因多半是 CSRF 没关,或者表单字段名跟 Spring Security 默认的不一致。Spring Security 默认接收的登录参数是 username 和 password,如果前端用的是 user 和 pwd,就认证不了。解决方法是自定义登录参数名,或者改前端表单的 name 属性。另外如果用了 Nginx 反向代理,要检查请求头里的 Origin 和 Referer 是否被拦截。
4.3 现象:登录成功但立刻跳回登录页
原因通常是 Session 没存住。可能是 Redis 连接不上,导致 Session 写不进去;也可能是 Session 的 Cookie 路径不对,浏览器没带上。解决方法是先看 Redis 里有没有 session 相关的 key,如果没有,检查 Redis 连接配置;如果有 key 但浏览器还是跳回登录页,检查 Cookie 的 domain 和 path 设置。我遇到过一种情况是项目部署在子路径下,Cookie 的 path 默认是 /,但应用上下文是 /admin,导致 Cookie 没带上。
4.4 现象:MyBatis 查询返回 null,但数据库里明明有数据
原因一般是字段名和属性名没对上,或者 map-underscore-to-camel-case 没开。解决方法是先看 SQL 日志,确认查询条件是否正确;再看 resultType 对应的类,属性名是否和数据库字段一致。如果数据库字段是 user_name,Java 属性是 userName,那 map-underscore-to-camel-case 必须为 true。另一个可能是查询条件里传了 null,导致 SQL 变成了 where name = null,永远查不到数据。
4.5 现象:Redis 报 “NOAUTH Authentication required”
原因是你给 Redis 设了密码,但 SpringBoot 配置文件里没填。解决方法是在 application.yml 的 spring.redis.password 里补上密码。如果 Redis 没设密码但报这个错,那可能是连到了别的 Redis 实例,检查 host 和 port 是否写错。我一般会在本地用 redis-cli -h 主机 -p 端口 先手动连一下,确认能通再改项目配置。
5. 装完怎么验证:从登录到权限控制的完整走查
装完之后别急着改代码,先按一条完整链路走一遍,确认每个环节都通了。第一步,启动 MySQL 和 Redis,用命令行确认能连上。第二步,启动 SpringBoot 应用,观察启动日志里有没有报错,重点看 Tomcat 端口、数据库连接池、Redis 连接池这三块。第三步,打开浏览器访问登录页,用初始账号登录,看是否能正常跳转到后台首页。第四步,在后台随便点几个菜单,确认 MyBatis 查询正常返回数据。第五步,退出登录,再登录,确认 Session 在 Redis 里能正常读写。
# 验证 Redis 里 Session 是否写入成功 redis-cli keys "*session*" # 如果有输出,说明 Session 已经存到 Redis # 查看某个 session 的过期时间 redis-cli ttl 你的session key # 返回正数说明 TTL 设置生效如果第五步走完没问题,再测一下权限控制:用一个没有某菜单权限的账号登录,看访问该菜单时是否被拦截。这一步能验证 Spring Security 的授权配置是否正确。我一般还会故意把 Redis 停掉,看应用是否报错、报错信息是否清晰,这样能提前发现单点依赖的问题。
从那以后我每次部署这套系统,都会强制走一遍“登录-查数据-退出-再登录”的闭环,确认 Redis 里的 Session 读写正常才继续改代码。希望帮到你。
本文还有配套的精品资源,点击获取