【基于轻量型架构的WEB开发】课程 13.2.4 拦截器 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

13.2.4****案例:后台系统登录验证

运用学过的拦截器知识,实现一个后台系统登录验证的案例

案例要求
本案例主要是对用户登录状态的验证,只有登录成功的用户才可以访问系统中的资源。

为了保证后台系统的页面不能被客户直接请求访问,本案例中所有的页面都存放在项目的

WEB-INF****文件夹下,客户需要访问相关页面时,需要在服务器端转发到相关页面。如果没

有登录系统而直接访问系统首页,拦截器会将请求拦截,并转发到登录页面,同时在登录页

面中给出提示信息。如果用户登录时提交的用户名或密码错误,也会在登录页面给出相应的

提示信息。当已登录的用户在系统页面中单击"退出"链接时,系统同样会回到登录页面。

后台系统登录验证的流程图:

了解了案例的验证规则,接下来就在项目中实现后台系统登录验证,具体实现步骤如下所示。

1

创建User类,在User类中,声明username和password属性,分别表示用户名和密码,并定义了每个属性的getter/setter方法。

java 复制代码
public class User {
private String username; //用户名
private String password; //用户密码
 // 省略getter/setter方法
}

2

创建控制器类UserController,并在该类中定义跳转到系统首页、跳转到登录页面、跳转到订单信息页面、用户登录和用户退出五个方法。UserController类的部分代码如下所示。

java 复制代码
@Controller
public class UserController {
 // 跳转到系统首页,跳转到登录页面,跳转到订单信息页面,用户登录省略
 @RequestMapping("/logout")
public String logout(HttpSession session) {// 用户退出
session.invalidate(); // 清除Session
return "redirect:tologin"; // 退出登录后重定向到登录页面
}
}

3

创建拦截器LoginInterceptor,在重写的preHandle()方法中对请求进行拦截。
LoginInterceptor类中部分代码如下所示。

java 复制代码
// 对用户登录的相关请求,放行
if(uri.indexOf("/login")>=0) { return true; }
HttpSession session = request.getSession();
// 如果用户是已登录状态,放行
if(session.getAttribute("USER_SESSION")!=null) { return true; }
// 其他情况都直接跳转到登录页面
request.setAttribute("msg", "您还没有登录,请先登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
.forward(request,response);

4

在Spring MVC配置文件spring-mvc.xml中配置包扫描、注解驱动、视图解析器、拦截器和静态资源访问映射,具体配置如下所示。

<!-- 配置创建 spring 容器要扫描的包 -->
<context:component-scan basepackage="com.itheima.controller"/>
<mvc:annotation-driven/> <!-- 配置注解驱动 -->
<!-- 配置视图解析器 --><bean class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/></bean>
<mvc:interceptors> <!-- 配置拦截器 -->
<bean class="com.itheima.interceptor.LoginInterceptor"/>
</mvc:interceptors>
<!-- 配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截 -->
<mvc:resources mapping="/js/**" location="/js/"/>

5

在jsp文件夹中创建名称为main.jsp文件作为系统首页。在main.jsp中展示当前登录的用户名、用户退出页面的超链接和订单信息页面的超链接。

XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html><head><title>后台系统</title></head>
<body>
<li>您好:${ USER_SESSION.username }</li>
<li><a href="${ pageContext.request.contextPath }/logout">退
 </a></li>
<li><a href="${ pageContext.request.contextPath }/orderinfo">
订单信息</a></li>
</body></html>

6

创建一个登录页面login.jsp,login.jsp中编写一个用于提交用户登录信息的表单。

XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html><head><title>用户登录</title></head><body>
<form action="${pageContext.request.contextPath }/login"
method="POST"><div>${msg}</div>
用户名:<input type="text" name="username"/><br/>
密&nbsp;&nbsp;码:
<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form></body></html>

7

创建一个订单信息页面orderinfo.jsp,orderinfo.jsp用于展示订单信息。

XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8
"pageEncoding="UTF-8"%>
<html><head><title>订单信息</title></head><body>
您好:${ USER_SESSION.username }
<a href="${ pageContext.request.contextPath }/logout">退出</a>
<table border="1" width="80%">
<tr align="center"><td colspan="2" >订单id:D001</td></tr>
<tr align="center"><td>商品Id</td><td>商品名称</td></tr>
<tr align="center"><td>P001</td><td>三文鱼</td></tr>
<tr align="center"><td>P002</td><td>红牛</td></tr>
</table></body></html>

8

启动chapter13项目,在浏览器中访问系统首页,访问路径为
http://localhost:8080/chapter13/main。系统首页效果如图所示。

9

在浏览器中访问订单信息页面,访问路径为
http://localhost:8080/chapter13/orderinfo。未登录访问订单信息页面显示效果如图所示。

从步骤8和步骤9的图可以看出来,两次访问都显示用户登录界面。表明当用户没有登录时,访问系

统的资源都会跳转到登录页面,并且显示登录提示信息。

10

在步骤9所示的表单中,不填写任何用户信息,直接单击左下角的"登录"按钮,页面显示效果如图所示。


从上图所示的页面显示效果可以看出,系统提示用户重新登录。当用户登录时,如果填写的用户信
息不正确,页面会重新跳转回登录页面,并且显示登录错误提示信息。

11

在 步骤10 所示的表单中,用户名输入框中填写heima,密码输入框中填写123456,然后单击左下角的"登录"按钮,页面进行跳转,跳转页面如图所示。

12

在 步骤11 所示的页面中,单击"订单信息"超链接,页面显示效果如图所示。

从图中所示的页面信息可以看出,当用户登录成功后,再访问系统中的资源会被拦截器放行。

13

在 步骤12 所示的页面中,单击"退出"超链接,页面显示效果如图所示。

从图中页面显示效果可以看出,当用户退出登录后,页面跳转回用户登录页面。至此,后台系统登录验证案例全部完成。

相关推荐
数字游名Tomda12 小时前
美团 LongCat 开源大模型60 亿参数 MoE 架构,赋能开发者加速 AI 应用落地
人工智能·架构·开源·ai模型
柴狗狗12 小时前
Spring AI调用sglang模型返回HTTP 400分析处理
人工智能·spring
原来是好奇心12 小时前
深入剖析Spring Boot中Spring MVC的请求处理流程
spring boot·spring·mvc
xkroy12 小时前
创建Spring MVC和注解
学习·spring·mvc
期待のcode12 小时前
SpringMVC的请求接收与结果响应
java·后端·spring·mvc
CHEN5_0214 小时前
【CouponHub开发记录】SpringAop和分布式锁进行自定义注解实现防止重复提交
java·分布式·spring·项目
编啊编程啊程14 小时前
Netty从0到1系列之Selector
java·spring boot·spring cloud·java-ee·kafka·maven·nio
天若有情67319 小时前
《JAVA EE企业级应用开发》第一课笔记
java·笔记·后端·java-ee·javaee
relis19 小时前
USB4与PCIe的技术融合:新一代接口协议的架构革新
网络·架构
sanggou19 小时前
Apache Doris:重塑湖仓一体架构的高效计算引擎
架构·数据分析·apache