当前位置: 首页 > article >正文

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

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

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

案例要求

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

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

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

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

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

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

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

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

1

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

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

2

创建控制器类UserController,并在该类中定义跳转到系统首页、跳转到登录页面、跳转到订单信息页面、用户登录和用户退出五个方法。UserController类的部分代码如下所示。
@Controller
public class UserController {
 // 跳转到系统首页,跳转到登录页面,跳转到订单信息页面,用户登录省略
 @RequestMapping("/logout")
public String logout(HttpSession session) {// 用户退出
session.invalidate(); // 清除Session
return "redirect:tologin"; // 退出登录后重定向到登录页面
}
}

3

创建拦截器LoginInterceptor,在重写的preHandle()方法中对请求进行拦截。
LoginInterceptor类中部分代码如下所示。
// 对用户登录的相关请求,放行
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中展示当前登录的用户名、用户退出页面的超链接和订单信息页面的超链接。
<%@ 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中编写一个用于提交用户登录信息的表单。
<%@ 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用于展示订单信息。
<%@ 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 所示的页面中,单击“退出”超链接,页面显示效果如图所示。
从图中页面显示效果可以看出,当用户退出登录后,页面跳转回用户登录页面。至此,后台系统登录验证案例全部完成。


http://www.kler.cn/a/397873.html

相关文章:

  • 《InsCode AI IDE:编程新时代的引领者》
  • ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析
  • Python爬虫项目 | 一、网易云音乐热歌榜歌曲
  • DAY120java审计第三方组件依赖库挖掘FastjsonShiroLog4jH2DB
  • 2024-11-16-机器学习方法:无监督学习(1) 聚类(上)
  • 琐碎笔记——pytest实现前置、后置、参数化、跳过用例执行以及重试
  • 机器学习:XGBoost模型(升级版)——高效且强大的树形模型
  • 安全见闻4
  • 《C语言程序设计现代方法》note-5 数组
  • 【开源免费】基于SpringBoot+Vue.JS卫生健康系统(JAVA毕业设计)
  • 【C++】OGRE:面向对象图形渲染库配置与示例
  • 2024山西省网络建设运维第十八届职业院校技能大赛解析答案(5. nginx 和 tomcat 服务)
  • 模型压缩相关技术概念澄清(量化/剪枝/知识蒸馏)
  • Pyhon基础数据结构(列表)【蓝桥杯】
  • 永磁同步电机负载估计--降阶龙贝格观测器
  • openai 论文Scaling Laws for Neural Language Models学习
  • 【项目日记】仿mudou的高并发服务器 --- 整体框架搭建 ,实现时间轮模块
  • 【Rust设计模式之新类型模式】
  • Android加载pdf
  • 鸿蒙HarmonyOS 地图不显示解决方案
  • ssm105基于JAVAEE技术校园车辆管理系统+jsp(论文+源码)_kaic
  • 力扣-Mysql-3278. 寻找数据科学家职位的候选人 II(中等)
  • 交易术语汇总(Technical Trading Dictionary)
  • FastAdmin 部署二开项目遇到 “No input file specified“ 的解决方案
  • 整数唯一分解定理
  • (干货)Jenkins使用kubernetes插件连接k8s的认证方式