ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JavaWeb在线学习系统毕设全解析:从数据库到部署避坑指南

JavaWeb在线学习系统毕设全解析:从数据库到部署避坑指南 简介本资源是一套完整的基于JavaWeb的在线学习系统毕设项目面向计算机专业本科生及Java初学者解决毕业设计选题难、实战项目缺失、B/S架构开发经验不足等实际问题。压缩包共3个文件含项目源码ZIP、MySQL数据库脚本SQL及详细部署说明TXT总大小23.22MB结构清晰、开箱即用涵盖JSPServletJDBC核心开发范式与典型三层架构实践。已有6371人学习下载广泛用于课程设计、实训演练与毕设答辩。用户可直接导入Eclipse在JDKTomcatMySQL环境下一键运行系统支持管理员、教师、学生三角色协同覆盖专业/班级管理、作业发布批阅、教学视频点播、在线自测、公告留言、资料下载等全流程教学功能模块代码规范、注释完整、界面简洁具备真实教育平台的业务逻辑与工程落地能力。 前阵子帮几个学弟学妹梳理过JavaWeb毕业设计的代码发现“在线学习系统”这个题目出现的频率相当高。今天干脆把这套项目里的完整思路拿出来拆一遍从项目设计、数据库表结构、核心代码实现到常见的坑点一次讲清楚。如果你正在选毕设题目或者想找一个能直接跑通的JavaWeb项目案例来练手这篇内容应该能帮你省下不少折腾的时间。这类系统的核心价值在于覆盖了JavaWeb开发里的主要知识点Servlet生命周期、JSP页面渲染、JDBC数据库访问、会话管理、文件上传、分页查询、权限控制几乎把课程里学过的东西全串起来了。而且它不像电商系统那样涉及复杂的支付和库存逻辑也不像社交系统那样要处理高并发功能边界清晰、业务体量适中作为毕设或课程设计都非常合适。在正式动手写代码之前我建议先把整套系统的功能边界和表结构想清楚而不是直接打开IDEA就开始堆页面。顺序搞反了后面返工的痛苦你想象不到。1. 项目概览与核心功能拆解1.1 一套在线学习系统需要具备哪些功能一套完整可演示的在线学习系统至少要覆盖三类角色学生、教师、管理员。三者关注点完全不同权限区分是系统设计的起点。学生端要能做的事包括注册登录、浏览课程列表、查看课程详情、加入学习选课、按章节观看视频或阅读资料、参加在线测试并查看成绩、对课程进行评价留言。教师端要能发布课程、上传课件资源、开放在线测试、添加测试题目、查看选课学生的成绩。管理员端要能管理用户禁用/启用账号、审核课程、统计平台数据课程数、用户数、访问量等。有的同学习惯把教师和管理员合并成一个角色短时间演示可以但答辩时老师大概率会问“你怎么区分普通用户和管理员权限”到时候说不清楚就尴尬了。建议老老实实做三种角色通过user表里的role字段区分登录后根据角色跳转到不同首页逻辑不复杂但能体现完整性。从技术角度看用户最核心的流程是“注册-登录-选课-学习-测试-查看结果”这条主链路一定要跑通并且稳定。周边功能比如文件上传、验证码、分页搜索属于加分项时间充裕再逐个补上。1.2 技术选型为什么是JavaWeb而不是Spring Boot我知道很多人刚上手时会纠结现在企业里都写Spring Boot了毕设还用JSPServlet会不会显得过时我个人的建议是如果你的题目本身没有明确要求Spring Boot传统JavaWeb技术栈反而更稳妥。原因很简单——毕设的核心评价标准是“你懂不懂原理”而JSPServletJDBC正好能把HTTP请求处理、数据库连接、页面转发的底层逻辑暴露出来。你用Spring Boot写老师一问“Servlet的生命周期是什么”你答不上来等于白写而用传统技术栈至少每一行代码你都知道它在干什么。具体技术选型如下前端JSP JSTL EL表达式 Bootstrap或原生CSS后端Servlet 3.1 JavaBean DAO模式数据库MySQL 5.7 / 8.0服务器Tomcat 8.5开发工具IDEA社区版/旗舰版 Maven非必需JDK版本JDK 8这套组合最大的好处是依赖少、部署简单、运行环境不容易出幺蛾子。你在任何一台装有JDK和Tomcat的机器上都能跑起来不会出现“Maven仓库下载依赖失败导致项目无法启动”这种完全跟代码无关的坑。1.3 项目目录结构怎么划分才不容易乱JavaWeb项目虽然没有强制目录规范但包结构越清晰你后期维护和写答辩文档时越省力。建议的包结构如下com.example.learningsystem ├── entity // 实体类对应数据库表 │ ├── User.java │ ├── Course.java │ └── Chapter.java ├── dao // 数据访问层JDBC操作 │ ├── UserDao.java │ └── CourseDao.java ├── service // 业务逻辑层可选简单项目可以省略 ├── servlet // 控制器层接收请求并跳转 │ ├── LoginServlet.java │ └── CourseServlet.java ├── filter // 过滤器 │ ├── EncodingFilter.java │ └── AuthFilter.java ├── util // 工具类数据库连接池、字符串处理等 │ └── DBUtil.java └── webapp // web资源JSP页面、CSS、JS ├── index.jsp ├── login.jsp └── course/注意Servlet类不要起名“XxxSevlet、XxxServelet”这种拼错的包名我见过多次因为拼写错误导致一晚上找不出404的原因。包路径首字母小写类名首字母大写这是基础规范但确实有大量初学者会忽略。2. 数据库设计整个系统的地基2.1 核心表结构设计与建表SQL数据库设计是整套系统最重要的一环。表结构一旦定了后面写代码只是体力活表结构设计不合理越写到后面越难受可能要在代码里用各种奇怪的SQL去弥补最终把自己绕晕。在线学习系统最少需要六张表用户表(user)、课程表(course)、章节表(chapter)、资源表(resource)、测试题目表(question)、测试成绩表(result)。如果要做评价功能再加一张评论表(comment)。先看用户表包含主键id、用户名、密码、角色、昵称、邮箱、创建时间、状态。密码字段建议长度设置到64位后续如果升级为MD5或SHA加密不会长度不够。CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 用户名, password varchar(64) NOT NULL COMMENT 密码, role tinyint(4) NOT NULL DEFAULT 2 COMMENT 角色0管理员1教师2学生, nickname varchar(50) DEFAULT NULL, email varchar(100) DEFAULT NULL, status tinyint(4) NOT NULL DEFAULT 1 COMMENT 账号状态1正常0禁用, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;课程表要包含课程名称、简介、封面图路径、发布教师id、课时数、创建时间。注意teacher_id要设置成逻辑外键而非物理外键我的原因是后面导入数据和批量删除的时候逻辑外键会省很多麻烦。CREATE TABLE course ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL COMMENT 课程名, description text COMMENT 课程简介, cover varchar(255) DEFAULT NULL COMMENT 封面图路径, teacher_id int(11) NOT NULL COMMENT 发布教师id, status tinyint(4) NOT NULL DEFAULT 0 COMMENT 审核状态0待审核1通过2下架, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;章节表和资源表是一对多关系一个课程下面挂多个章节每个章节下面挂多个资源。资源类型可以区分为视频和文档通过type字段控制。CREATE TABLE chapter ( id int(11) NOT NULL AUTO_INCREMENT, course_id int(11) NOT NULL COMMENT 所属课程id, title varchar(100) NOT NULL COMMENT 章节标题, sort int(11) NOT NULL DEFAULT 0 COMMENT 排序号, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;题目表和成绩表是测试功能的数据基础。题目表包含所属测试id、题干、四个选项和后正确答案成绩表记录学生id、测试id、得分和提交时间。2.2 表关系与一条完整的联表查询这六张表的关系不算复杂user和course是一对多一个教师发布多个课程course和chapter是一对多chapter和resource是一对多user和course是多对多学生和课程的选课关系需要一张选课表course_studentuser和result是一对多。多对多关系建议单独建关联表不要塞在user表或course表里。选课表的SQL大概长这样CREATE TABLE course_student ( id int(11) NOT NULL AUTO_INCREMENT, course_id int(11) NOT NULL, user_id int(11) NOT NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_course_user (course_id,user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;其中UNIQUE KEY的作用是防止同一个学生重复选同一门课这是一种非常实用的兜底方案。我当时就是没加这个唯一约束测试时连续选课导致数据重复后来又去代码里查重复逻辑浪费了不少时间。联表查询是答辩时老师必问的内容。比如查询“某学生所有已选课程且包含教师昵称”需要关联三张表SELECT c.id, c.name, c.description, u.nickname AS teacher_name FROM course c JOIN course_student cs ON c.id cs.course_id JOIN user u ON c.teacher_id u.id WHERE cs.user_id 5如果你写出这条SQL并能解释清楚JOIN的语义这段基本稳了。2.3 用IDEA导出数据库脚本的完整操作做好数据库表后你需要把建表语句导出成.sql文件这个文件就是项目代码里带的“数据库脚本”。有的同学直接在Navicat里右键导出整个数据库结果导出的文件里带着外键、视图、触发器老师在别的机器上导入就报错一串。这里我强烈建议用IDEA自带工具或mysqldump命令导出参数干净可控。IDEA导出数据库脚本的操作步骤如下打开IDEA右侧的Database工具窗口配置数据源连接MySQL。右键选中你要导出的数据库比如online_learning。选择 SQL Scripts - SQL Dump。勾选Data、Schema选项选择导出路径。导出完成后打开.sql文件检查文件开头应该只有CREATE DATABASE、USE、CREATE TABLE和INSERT语句。如果你更习惯命令行也可以用mysqldumpmysqldump -uroot -p --default-character-setutf8mb4 online_learning online_learning.sql注意加--default-character-setutf8mb4不然导出的脚本里中文注释和表内容在目标机器上导入时容易乱码。导入脚本时先创建数据库再导入mysql -uroot -p CREATE DATABASE online_learning DEFAULT CHARACTER SET utf8mb4; USE online_learning; SOURCE /path/to/online_learning.sql;很多同学的脚本在老版本MySQL上导入失败绝大多数原因是建表时用了utf8mb4但服务器数据库默认字符集还是latin1。保险起见建库语句里显式指定utf8mb4不要在代码里依赖服务器默认配置。3. 实操过程与核心环节实现3.1 开发环境选型与版本搭配我在项目里用的组合是JDK 8 Tomcat 8.5 MySQL 5.7 IDEA 2022.1这套组合在兼容性上经历过大量实际检验基本不会出方向性的大坑。JDK版本尽量用8不要图新鲜装17或21。原因很实际Tomcat 8.5对JDK 8的支持最好而市面上很多教程、博客、老项目代码都是基于JDK 8写的照抄不会出现“警告: 非法反射访问”这种让人心慌的提示。IDEA版本我建议用2021到2023之间的版本太新的版本内置的Tomcat插件偶尔会有适配问题。如果你用的是IDEA社区版没有自带Tomcat集成需要手动配置外部Tomcat旗舰版则可以直接用Tomcat Server插件。数据库用MySQL 5.7还是8.0都行但连接驱动要匹配。5.7用mysql-connector-java 5.1.498.0用8.0.33别把版本混了。3.2 用IDEA创建一个JavaWeb项目并配置Tomcat第一次创建JavaWeb项目时容易一头雾水。我这里给出一套可以直接照做的流程新建项目选择Empty Project或Maven项目。如果用Maven在pom.xml里加Servlet和JSTL依赖如果是Empty Project手动引入Tomcat的servlet-api.jar。在src/main目录下新建java目录里面按包路径建好entity、dao、servlet、filter等包。在src/main下新建webapp目录里面放WEB-INF、JSP页面、CSS静态资源。WEB-INF下的web.xml是核心配置文件。配置TomcatRun - Edit Configurations - 点加号 - Tomcat Server - Local。选择本机Tomcat的路径然后在Deployment选项卡里把项目添加进去Application context设置为/learn。启动Tomcat浏览器访问http://localhost:8080/learn。有一个很容易忽略的坑在IDEA里配置好Tomcat后如果项目名下没有出现“Artifacts”相关的Web模块部署时会提示“No artifacts marked for deployment”。需要进入Project Structure - Artifacts点加号 - Web Application: Exploded把项目加入后再回到Tomcat配置页点Fix按钮问题就解决了。3.3 登录功能的前后端完整实现登录功能是整个系统的入口几乎所有页面都受它保护。我建议先从登录功能开始写它刷通了后面其他模块的套路都一样。前端登录页核心就是一个表单action指向LoginServletmethod用postform action${pageContext.request.contextPath}/login methodpost input typetext nameusername placeholder请输入用户名 / input typepassword namepassword placeholder请输入密码 / button typesubmit登录/button /form对应的LoginServlet核心逻辑WebServlet(/login) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); UserDao userDao new UserDao(); User user userDao.findByUsernameAndPassword(username, password); if (user null) { req.setAttribute(error, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); return; } if (user.getStatus() 0) { req.setAttribute(error, 账号已被禁用请联系管理员); req.getRequestDispatcher(/login.jsp).forward(req, resp); return; } HttpSession session req.getSession(); session.setAttribute(loginUser, user); session.setMaxInactiveInterval(30 * 60); if (user.getRole() 0) { resp.sendRedirect(req.getContextPath() /admin/index.jsp); } else { resp.sendRedirect(req.getContextPath() /course/list); } } }这里面有几个细节值得注意。第一是req.setCharacterEncoding(UTF-8)必须放在读取参数的代码之前顺序反了会白写。第二是登录成功后用sendRedirect而不是forward防止用户刷新页面时重复提交登录请求。第三是session过期时间设置为30分钟这个值可以根据演示需要调短或调长但不要不设。对应的UserDao里查询方法是典型的JDBC操作public User findByUsernameAndPassword(String username, String password) { String sql SELECT * FROM user WHERE username ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setPassword(rs.getString(password)); user.setRole(rs.getInt(role)); user.setNickname(rs.getString(nickname)); user.setEmail(rs.getString(email)); user.setStatus(rs.getInt(status)); return user; } } } catch (SQLException e) { e.printStackTrace(); } return null; }这段代码用PreparedStatement做参数化查询而不是字符串拼接SQL。一方面避免了SQL注入风险另一方面也符合答辩老师对安全性的期待。你可以主动在答辩时提这一点属于加分操作。3.4 课程列表与分页功能的实现思路课程列表是学习系统的中心页面学生登录后第一眼看到的就是它。课程多起来以后必须做分页这里我分享一套最简单可靠的分页写法。分页三要素当前页码page、每页条数pageSize、总记录数totalCount。传入SQL层就是LIMIT语句的offset偏移量和limit返回行数。-- 查询某一页的课程数据 SELECT c.id, c.name, c.description, c.cover, u.nickname AS teacher_name FROM course c LEFT JOIN user u ON c.teacher_id u.id WHERE c.status 1 ORDER BY c.create_time DESC LIMIT ?, ?;Servlet中计算分页参数的逻辑int page 1; int pageSize 8; String pageStr req.getParameter(page); if (pageStr ! null !pageStr.isEmpty()) { page Integer.parseInt(pageStr); if (page 1) page 1; } CourseDao dao new CourseDao(); ListCourse courseList dao.findCourseByPage(page, pageSize); int totalCount dao.countCourse(); // SELECT COUNT(*) FROM course WHERE status 1 int totalPage (int) Math.ceil(totalCount * 1.0 / pageSize); req.setAttribute(courseList, courseList); req.setAttribute(currentPage, page); req.setAttribute(totalPage, totalPage); req.getRequestDispatcher(/course/list.jsp).forward(req, resp);两个容易出错的点一是totalPage算错当总数正好整除pageSize时比如40条数据每页8条totalCount(40) * 1.0 / 8 5.0ceil后为5没问题但如果是41条结果是5.125ceil为6正确。二是调用Integer.parseInt前没有做非数字校验用户手动输了个pageabc直接500虽然不影响正常使用但答辩老师测试边界时可能会发现建议加一个try catch兜底。JSP里的分页导航条用JSTL的c:forEach渲染页码nav ul lia href?page${currentPage - 1 0 ? 1 : currentPage - 1}上一页/a/li c:forEach vari begin1 end${totalPage} li class${i currentPage ? active : } a href?page${i}${i}/a /li /c:forEach lia href?page${currentPage 1 totalPage ? totalPage : currentPage 1}下一页/a/li /ul /nav要注意第一页时“上一页”不能指向第0页最后一页时“下一页”不能指向totalPage1用三元表达式兜底就能解决。4. 常见问题与排查技巧实录4.1 数据库连接失败先查这五个方向数据库连接报错是JavaWeb项目里最常见的启动期问题症状通常是Tomcat启动后页面报“Cannot create PoolableConnectionFactory”或“Connection refused”。排查顺序我总结为五步MySQL服务是否启动了Windows下到服务管理器看MySQL服务状态或者命令行执行net start mysql/mysql -uroot -p测试。JDBC连接URL的host和port是否对默认localhost:3306如果改了端口要同步。用户名密码是否正确root在本地默认无密码但如果你设过密码代码里写错一个字都会报Access denied。连接URL是否指定了useSSLfalse和serverTimezoneMySQL 8.0必须加serverTimezoneAsia/Shanghai否则报时区错误。驱动jar包是否放到WEB-INF/lib下如果是Maven项目检查依赖是否加载成功如果是手动导Jar包确认没有只放在编译路径而没进部署产物。我见过一个特别典型的案例同学在IDEA里测试JDBC连接成功但Tomcat一跑就报ClassNotFound。原因是IDEA配置的Project SDK和Tomcat的classpath不一致驱动jar没随项目部署到Tomcat的webapps目录。检查方式很简单启动Tomcat后去Tomcat安装目录下的webapps/项目名/WEB-INF/lib里看一眼有没有mysql-connector-java.jar。关于DBUtil的数据库连接不建议每次请求都创建Connection至少要用到连接池。简单项目可以用C3P0或者Druid配置文件里给最小连接数3、最大连接数10足够演示。这个配置在答辩时是一个很好的扩展点老师问起性能优化就能答上来。4.2 中文乱码是一场全链路的编码战争中文乱码问题几乎每个JavaWeb新手都会遇到而且很多时候花了几个晚上都解决不了。真相是乱码是整个请求链路上所有环节编码不统一的必然结果必须从浏览器到Servlet再到数据库逐一排查。前端页面保证 里设置UTF-8meta charsetUTF-8Servlet里读取POST请求参数前设置request和response编码req.setCharacterEncoding(UTF-8); resp.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8);在web.xml里配置统一编码过滤器这是最一劳永逸的做法filter filter-nameencodingFilter/filter-name filter-classcom.example.learningsystem.filter.EncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping数据库连接URL也要指定编码jdbc:mysql://localhost:3306/online_learning?useUnicodetruecharacterEncodingutf8最后一个坑是JSP的pageEncoding属性有的JSP文件忘了写pageEncodingUTF-8导致页面本身保存的字节流就是乱码部署后浏览必然乱。验证方式浏览器右键查看源码中文直接乱码就是JSP文件本身出了问题跟Servlet没有关系。4.3 Tomcat部署后的404与部署失败怎么排查项目打开时主页还能访问但一点“登录”就404这个场景太经典了。排查思路404的第一个方向是访问路径错了。项目部署后访问路径等于IP端口Application ContextServlet的URL映射三个拼接部分任何一个不对都404。强烈建议在所有Servlet注解里写相对路径JSP里用${pageContext.request.contextPath}拼接路径不要写死绝对路径。404的第二个方向是Tomcat部署没成功。打开Tomcat控制台日志看到“Deploying web application archive”之后有没有报错。有些时候是项目里WEB-INF/lib下的jar包冲突导致部署中断日志里会直接打印异常类名比如NoSuchMethodError或ClassNotFoundException按提示去修。顺便说一个低级但常见的坑web.xml里的servlet-mapping写错了URL pattern比如把/login写成了/login/前端提交到/login服务器找不到对应映射同样404。这类问题多看几遍日志不要上来就怀疑代码逻辑。4.4 接手项目后的三个检查项很多时候你需要在自己电脑上跑别人给的源码或者你交出去的源码在别人那里就是跑不起来。这时不要慌按下面的顺序检查数据库脚本是否导入成功执行SELECT COUNT(*) FROM user;如果表不存在或数据为空说明SQL脚本不完整或导入时出错。数据库账号密码是否改成本机配置很多项目把数据库配置写在db.properties或DBUtil.java里默认账号是root密码是123456你的机器密码不一致就要改。JDK和Tomcat版本是否匹配项目编译时用的JDK版本和你运行的JDK版本不匹配可能出现Class version错误控制台提示“UnsupportedClassVersionError”。这时把项目的Language Level调到跟JDK一致就行。这三个检查项能解决90%以上的“我明明按步骤来了为什么跑不起来”问题。所以我一直建议项目源码里必须附带一份README写清楚JDK版本、Tomcat版本、数据库版本、账号密码、部署步骤这是一个成熟的毕设项目该有的素养。5. 项目提交与答辩前必做的三件事5.1 数据库脚本完整性校验提交项目前请在一台干净的环境里完整走一遍部署流程重点验证数据库脚本能否直接导入。很多同学在开发机上导入成功但脚本里包含了本地库的冗余数据、外键引用顺序错误、字符集不统一等问题换个环境就垮了。校验方法新建一个空白数据库用提交的.sql脚本执行验证所有表和数据都产生再启动项目跑一遍主流程。另外确认脚本里没有包含本地测试的垃圾数据比如id为1的测试学生的密码是明文这个问题不大但如果有几十条重复的“测试”课程数据会显得很不专业。脚本里最好加上注释比如“-- 创建用户表”这种既方便老师审阅也能体现你的工程素养。提交的源码中建议把.sql文件放在database目录下和README的说明对应起来。5.2 README文档里至少要写四类信息很多同学的README只有一句“在线学习系统JavaWeb毕设”这太单薄了。一份合格的README至少要包含环境版本清单JDK、Tomcat、MySQL、IDEA、部署步骤从导入脚本到启动服务器、默认账号管理员/教师/学生的用户名密码、项目结构说明每个包和目录的职责。我习惯把部署步骤写成一段可以直接复制的命令序列比如先导入数据库再启动Tomcat然后访问地址。这份文档不仅是给老师看的也是给未来的你准备的。三个月后你再打开这个项目没有README只能干瞪眼。5.3 答辩演示时建议走的演示路径答辩时间有限建议按“功能演示-代码讲解-设计亮点”三条线组织回答。功能演示以学生身份登录走一遍“选课-学习-做题-查看成绩”的完整闭环让老师看到系统能正常流转。代码讲解集中在登录鉴权和分页查询两个点把Servlet的前后端交互和SQL的拼接逻辑讲清楚。设计亮点可以讲数据库表设计中的唯一约束避免了重复选课、PreparedStatement防SQL注入、过滤器统一处理编码和登录拦截。关于登录拦截我再多说一句。这不是必须功能但如果做了演示时就是“我有而别人没有”的加分项。实现方式很简单写一个AuthFilter拦截所有非登录页面请求检查session里有没有loginUser没有就重定向到登录页。WebFilter(/*) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; HttpSession session req.getSession(false); String uri req.getRequestURI(); boolean isLoginPage uri.endsWith(login.jsp) || uri.contains(/login); boolean isStatic uri.matches(.*\\.(css|js|jpg|png|gif)$); if (session ! null session.getAttribute(loginUser) ! null) { chain.doFilter(request, response); } else if (isLoginPage || isStatic || uri.endsWith(/index.jsp)) { chain.doFilter(request, response); } else { resp.sendRedirect(req.getContextPath() /login.jsp); } } }这个小过滤器代码量不大但能带你走过一整套“拦截器”概念答辩时还能顺带聊到Spring MVC里的Interceptor显得知识面宽。我个人在实际操作里的经验是先把主流程跑通再做过滤器不要一上来就铺一大堆全局控制否则会被各种“我登录都过不去”的报错消磨掉信心。整套项目做完之后你会发现自己的进步是实实在在的。数据库设计、JDBC操作、前端页面、部署排查每一块都有涉及而这些东西恰恰是后续学习和工作中一直要用到的基础能力。这一篇提到的坑和排查思路都是我实际走过一遍之后浓缩出来的希望能帮你少走一些弯路。本文还有配套的精品资源点击获取
返回列表