
一、项目简介最近在学习 JSP 网络程序设计时我做了一个非常经典的小项目用户登录验证系统。这个系统虽然不大但是里面包含了很多 JSP 初学者必须掌握的知识点比如表单提交request.getParameter()获取表单数据session保存登录状态jsp:forward页面转发response.sendRedirect()页面重定向页面保护公共页面抽取头部、菜单、底部退出登录这个案例非常适合作为 JSP 入门练习。下面我就把完整思路、代码结构和关键知识点整理出来。二、项目功能本项目实现了以下功能用户进入登录页login.jsp输入用户名和密码后提交到check.jspcheck.jsp判断账号密码是否正确正确则进入success.jsp错误则进入fail.jspsuccess.jsp受保护未登录时不能直接访问点击退出后通过logout.jsp清除登录状态并返回登录页三、项目结构我的项目文件结构如下login.jsp // 登录页面 check.jsp // 登录校验页面 success.jsp // 登录成功页面 fail.jsp // 登录失败页面 logout.jsp // 退出登录页面 header.jsp // 公共头部 menu.jsp // 公共菜单 footer.jsp // 公共底部如果有图片资源还可以再放一个images文件夹images/ login.png left.jpg right.jpg四、运行效果说明1. 登录页用户输入用户名和密码点击“登录”。2. 校验逻辑后台设定的正确账号密码为用户名lycoris 密码1234563. 成功页如果输入正确就进入成功页面并显示欢迎信息。4. 失败页如果输入错误就进入失败页面并提示“用户名或密码错误”。5. 页面保护如果用户没有登录直接访问success.jsp系统会拦截并跳转回登录页同时弹出提示成功页面受保护请先登录6. 退出登录点击“退出登录”后系统会销毁session并返回登录页。五、核心页面代码与讲解1. 登录页login.jsp这是整个项目的入口页面主要作用是显示登录表单。% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % !DOCTYPE html html head meta charsetUTF-8 title用户登录/title /head body % String msg (String)session.getAttribute(msg); if(msg ! null){ % script alert(%msg%); /script % session.removeAttribute(msg); } % % include fileheader.jsp % % include filemenu.jsp % div classwrapper div classmain h2用户登录/h2 form actioncheck.jsp methodpost table tr td用户名/td tdinput typetext nameusername/td /tr tr td密 码/td tdinput typepassword namepassword/td /tr /table div classbtn input typesubmit value登录 input typereset value重置 /div /form /div /div % include filefooter.jsp % /body /html这里的关键点有三个1表单提交form actioncheck.jsp methodpost表示把表单数据提交到check.jsp页面并使用post方式发送。2输入框的name很重要input typetext nameusername input typepassword namepassword后端就是通过这两个名字取值的request.getParameter(username); request.getParameter(password);所以name一定要和后端保持一致。3利用session弹出提示信息String msg (String)session.getAttribute(msg);这段代码用于接收其他页面传来的提示比如未登录访问成功页时会先把提示信息存到session中再跳回登录页。然后登录页用alert()弹出来。2. 校验页check.jsp这个页面不负责显示界面主要负责处理登录逻辑。% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % % request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); if(lycoris.equals(username) 123456.equals(password)){ session.setAttribute(loginUser, username); % jsp:forward pagesuccess.jsp / % }else{ % jsp:forward pagefail.jsp / % } %这段代码的核心逻辑1解决中文乱码request.setCharacterEncoding(UTF-8);如果表单中输入中文提交后可能会乱码所以通常在接收参数前先设置编码。2获取表单提交的数据String username request.getParameter(username); String password request.getParameter(password);request.getParameter()用来获取前端表单传来的值。3判断账号密码if(lycoris.equals(username) 123456.equals(password))这是一种很常见的字符串比较写法。这里把常量写在前面是为了防止username为空时出现空指针异常。4保存登录状态session.setAttribute(loginUser, username);登录成功后把用户名存入session表示当前用户已经登录。以后只要session中还有这个值就可以认为用户处于登录状态。5页面转发jsp:forward pagesuccess.jsp /或者jsp:forward pagefail.jsp /这是服务器内部转发浏览器地址栏不会变化但页面内容会变。它和response.sendRedirect()不一样forward服务器内部转发一次请求sendRedirect浏览器重新请求两次请求3. 成功页success.jsp这个页面除了显示登录成功信息还有一个非常重要的功能页面保护。% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % % String loginUser (String)session.getAttribute(loginUser); if(loginUser null){ session.setAttribute(msg, 成功页面受保护请先登录); response.sendRedirect(login.jsp); return; } % !DOCTYPE html html head meta charsetUTF-8 title登录成功/title /head body % include fileheader.jsp % % include filemenu.jsp % div classwrapper div classmain h2登录成功/h2 div classmsg欢迎 %loginUser % 登录/div div classinfo用户名和密码验证通过。/div div classlink-box a hreflogin.jsp返回登录页/a a hreflogout.jsp退出登录/a /div /div /div % include filefooter.jsp % /body /html页面保护原理String loginUser (String)session.getAttribute(loginUser);先从session中取出登录用户。如果没有取到if(loginUser null)说明用户没有登录或者登录状态已经失效。于是执行session.setAttribute(msg, 成功页面受保护请先登录); response.sendRedirect(login.jsp); return;意思是先把提示信息放进session重定向到登录页return结束当前页面执行这样就实现了受保护页面的拦截。4. 失败页fail.jsp登录失败页主要负责给用户提示。% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % !DOCTYPE html html head meta charsetUTF-8 title登录失败/title /head body % include fileheader.jsp % % include filemenu.jsp % div classmain h2登录失败/h2 div classmsg用户名或密码错误/div div stylemargin-top:25px; a hreflogin.jsp返回重新登录/a /div /div % include filefooter.jsp % /body /html这个页面比较简单主要用于展示错误结果。5. 退出页logout.jsp退出登录最关键的一步就是销毁session。% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % % session.invalidate(); % jsp:forward pagelogin.jsp /解释session.invalidate();表示让当前会话失效也就是把登录状态彻底清除。然后再跳回登录页jsp:forward pagelogin.jsp /这样用户就退出系统了。6. 公共页面抽取header.jsp、menu.jsp、footer.jsp为了避免每个页面都重复写头部、导航栏和底部我们把公共部分单独拆出来。header.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % div stylebackground:#dfefff;padding:15px;text-align:center; h2我的JSP网站/h2 /divmenu.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % div stylebackground:#f2f2f2;padding:12px 20px;border-bottom:1px solid #dcdcdc; a hreflogin.jsp登录页/a | a hrefsuccess.jsp成功页/a | a hreffail.jsp失败页/a /divfooter.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % div stylebackground:#dfefff;padding:10px;text-align:center;margin-top:20px; 版权所有JSP实验页面-2026/3/26 /div在其他页面中引入% include fileheader.jsp % % include filemenu.jsp % % include filefooter.jsp %这叫做静态包含适合放一些结构固定的公共页面。六、本项目涉及到的 JSP 重点知识这个小项目虽然不大但其实包含了很多考试和实验中高频出现的内容。1. page 指令% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %作用指定页面内容类型指定字符编码防止中文乱码2. include 指令% include fileheader.jsp %作用把公共页面插入当前页面减少重复代码适合做页头、菜单、页脚3. request 对象request.getParameter(username);作用获取表单提交的数据获取用户请求中的参数4. session 对象session.setAttribute(loginUser, username); session.getAttribute(loginUser); session.invalidate();作用保存用户会话信息记录登录状态页面保护退出登录5.jsp:forwardjsp:forward pagesuccess.jsp /作用页面转发服务器内部完成跳转浏览器地址栏一般不变6.response.sendRedirect()response.sendRedirect(login.jsp);作用重定向到其他页面浏览器会重新发起请求地址栏会变化七、forward 和 redirect 的区别这一点特别容易考也特别容易混。1. forward转发jsp:forward pagesuccess.jsp /特点服务器内部跳转浏览器只发一次请求地址栏一般不变可以共享同一次 request 数据2. redirect重定向response.sendRedirect(login.jsp);特点浏览器重新请求新页面一共两次请求地址栏会变化不能直接共享上一次 request 数据3. 本项目中为什么成功页保护用 redirect因为未登录用户访问成功页时需要重新回到登录页这种场景用重定向更合适response.sendRedirect(login.jsp);而登录校验成功或失败时只是服务器内部判断后跳转到结果页所以这里用jsp:forward pagesuccess.jsp /八、项目运行流程梳理整个登录流程可以总结为login.jsp ↓ 表单提交到 check.jsp ↓ 获取 username 和 password ↓ 判断账号密码是否正确 ↓ 正确 → session保存登录状态 → forward到success.jsp 错误 → forward到fail.jsp ↓ success.jsp 判断 session 中是否存在 loginUser ↓ 存在 → 正常显示成功页面 不存在 → 提示后 redirect 到 login.jsp ↓ 点击 logout.jsp ↓ session.invalidate() ↓ 返回登录页九、这个项目适合初学者练什么我觉得这个案例特别适合 JSP 初学者练习以下能力1. 熟悉 JSP 基本语法包括% page %% include %% %% %2. 理解表单和后端交互知道前端通过form提交数据后端通过request.getParameter()获取数据3. 理解 session 登录状态知道为什么登录后要保存状态为什么访问受保护页面要先判断 session4. 理解页面跳转方式知道forward和redirect的区别不同场景该用哪一种5. 学会拆分公共页面知道页头、菜单、页脚可以抽出来提高代码复用性十、我在这个项目里的收获通过这个小项目我对 JSP 登录验证的基本流程有了比较清晰的认识。以前总觉得“登录”这件事很复杂但真正自己写下来后发现本质其实就是三步获取用户输入判断输入是否正确用 session 记录登录状态在这个基础上再加上页面保护、退出登录、公共页面抽取一个完整的 JSP 小型登录系统就搭起来了。虽然这个案例还比较基础比如账号密码是写死的还没有接数据库但它已经非常适合用来打牢 JSP 基础。后面如果继续扩展还可以增加数据库用户表验证Cookie 记住用户名验证码功能注册功能管理员登录权限控制十一、完整总结本次 JSP 登录验证系统主要完成了以下内容实现用户登录表单获取表单参数并校验使用session保存登录状态使用forward跳转成功页和失败页使用redirect实现页面保护使用session.invalidate()完成退出登录使用include抽取公共页面这是一个非常标准的 JSP 入门项目适合初学者反复练习也很适合作为网络程序设计课程实验。十二、结语对于 JSP 初学者来说登录案例几乎是必须掌握的内容。因为它不仅是一个功能点更是很多 Web 开发知识的综合运用。如果你刚开始学 JSP建议一定要把这个案例亲手敲一遍并且搞懂下面这几个问题表单数据是怎么传到后端的session 为什么能表示“已登录”forward 和 redirect 到底有什么区别为什么成功页要做页面保护把这些问题彻底弄明白后面学 Cookie、Session、JDBC、JavaBean 时就会顺很多。---------------------------------------------------------------------------------------------------------------------------------1. 表单数据是怎么传到后端的前端写表单form actioncheck.jsp methodpost 用户名input typetext nameusername 密码input typepassword namepassword input typesubmit value登录 /form用户点击提交后浏览器会把输入框里的值按name值的形式发给check.jsp。后端用String username request.getParameter(username); String password request.getParameter(password);来接收。你可以理解成前端负责“发”后端负责“收”2. session 为什么能表示“已登录”因为session是服务器给当前用户保存的一块会话空间。登录成功后服务器可以这样写session.setAttribute(loginUser, username);这就相当于在服务器上记了一条记录这个用户已经登录了他的名字是 xxx以后访问别的页面时只要还能取到session.getAttribute(loginUser)就说明这个用户之前登录过所以可以认为是“已登录”。退出时再执行session.invalidate();登录状态就没了。3. forward 和 redirect 到底有什么区别forward转发服务器内部把请求交给另一个页面处理。jsp:forward pagesuccess.jsp /特点浏览器只发1 次请求地址栏一般不变同一个request可以继续用redirect重定向服务器告诉浏览器你重新去访问另一个页面。response.sendRedirect(login.jsp);特点浏览器会发2 次请求地址栏会变化上一次request里的数据不能直接带过去4. 为什么成功页要做页面保护因为用户可能不登录直接在地址栏输入success.jsp。如果不做保护那任何人都能直接看到“登录成功”页面这就不合理了。所以成功页要先判断String loginUser (String)session.getAttribute(loginUser); if(loginUser null){ response.sendRedirect(login.jsp); return; }意思就是如果没有登录标记就不让进成功页直接打回登录页这就叫页面保护。你可以把这四句话直接记住表单数据浏览器提交后端接收session服务器记录用户登录状态forward服务器内部转发redirect浏览器重新跳转