Spring MVC拦截器完成用户登录权限验证的示例

ops/2025/1/20 0:21:05/

【图书介绍】《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》_【新华文轩】spring+spring mvc+mybatis从零开始学(视频教学版) 第3版 正版-CSDN博客

《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要 书评 试读】- 京东图书

【图书介绍】案例可借鉴的Spring应用开发书-CSDN博客

Spring开发_夏天又到了的博客-CSDN博客

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并进行相应的处理。例如,通过拦截器可以进行权限验证、判断用户是否已登录等。

本节将通过Spring MVC拦截器来完成一个用户登录权限验证的示例,该示例的执行流程如图14.5所示。

图14.5  用户权限验证的执行流程图

从图14.5所示的流程图可以看出,只有登录后的用户才能访问管理主页,如果没有登录而直接访问页面,拦截器就会将请求拦截,并转发到登录页面,同时在登录页面中给出提示信息。如果用户名或密码错误,也会在登录页面给出相应的提示信息。当已登录的用户在管理主页中单击“退出”链接时,同样会回到登录页面。

【示例14-3】下面示例讲解如何在项目中实现用户登录权限验证,具体步骤如下:

 在src目录下创建一个com.ssm.po包,并在包中创建User类,如文件14.6所示。

文件14.6  User.java

01	package com.ssm.po;
02	public class User {
03		private Integer id;
04		private String username;
05		private String password;
06		public Integer getId() {
07			return id;
08		}
09		public void setId(Integer id) {
10			this.id = id;
11		}
12		public String getUsername() {
13			return username;
14		}
15		public void setUsername(String username) {
16			this.username = username;
17		}
18		public String getPassword() {
19			return password;
20		}
21		public void setPassword(String password) {
22			this.password = password;
23		}
24	}

在com.ssm.controller包中创建控制器类UserController,并在该类中定义向主页跳转、向登录页面跳转、执行用户登录等操作的方法,如文件14.7所示。

文件14.7  UserController.java

01	package com.ssm.controller;
02	import jakarta.servlet.http.HttpSession;
03	import org.springframework.stereotype.Controller;
04	import org.springframework.ui.Model;
05	import org.springframework.web.bind.annotation.RequestMapping;
06	import org.springframework.web.bind.annotation.RequestMethod;
07	import com.ssm.po.User;
08	@Controller
09	public class UserController {
10		/*
11		 * 向用户登录页面跳转
12		 */
13		@RequestMapping(value="/toLogin",method=RequestMethod.GET)
14		public String toLogin(){
15			return "login";
16		}
17		/*
18		 * 用户登录
19		 */
20		@RequestMapping(value="/login",method=RequestMethod.POST)
21		public String login(User user,Model model,HttpSession session){
22			String username=user.getUsername();
23			String password=user.getPassword();
24			//模拟从数据库获取用户名和密码进行判断
25			if(username!=null && username.equals("wujit")){
26		   		if(password!=null && password.equals("123456")){
27	                  //用户存在,将用户信息保存到 Session中,并复位向到主页
28					session.setAttribute("user_session", user);
29					return "redirect:main";
30		   		}
31	         }
32	     	//用户不存在,添加错误信息到model中,并跳转到登录页面
33			model.addAttribute("msg","用户名或密码错误,请重新输入!");
34			return "login";
35		}	
36		/*
37		 * 向管理主页跳转
38		 */
39		@RequestMapping(value="/main")
40		public String toMain(){
41			   return "main";
42		}
43		/*
44		 * 退出
45		 */
46		@RequestMapping(value="/logout")
47		public String logout(HttpSession session){
48			session.invalidate();		
49			return "redirect:toLogin";
50		}
51	}

在文件14.7中,在用户登录方法中,首先通过User类型的参数获取了用户名和密码,然后通过语句来模拟从数据库中获取到用户名和密码后进行判断。如果存在此用户,就将用户信息保存到session中,并复位向到主页,否则跳转到登录页面。

 在com.ssm.interceptor包中,创建拦截器类LoginInterceptor,编辑后的代码如文件14.8所示。

文件14.8  LoginInterceptor.java

01	package com.ssm.interceptor;
02	import jakarta.servlet.http.HttpServletRequest;
03	import jakarta.servlet.http.HttpServletResponse;
04	import jakarta.servlet.http.HttpSession;
05	import org.springframework.web.servlet.HandlerInterceptor;
06	import org.springframework.web.servlet.ModelAndView;
07	import com.ssm.po.User;
08	public class LoginInterceptor implements HandlerInterceptor{
09		@Override
10		public boolean preHandle(HttpServletRequest request, 
11	HttpServletResponse response, Object handler) throws Exception {
12			//获取请求的URL
13			String url=request.getRequestURI();
14			//允许公开访问"/toLogin"
15			if(url.indexOf("/toLogin")>=0){
16				return true;
17			}
18			//允许公开访问"/login"
19			if(url.indexOf("/login")>=0){
20				return true;
21			}
22			//获取session
23			HttpSession session=request.getSession();
24			User user=(User)session.getAttribute("user_session");
25			//如果user不为空,表示已登录
26			if(user!=null){
27				return true;
28			}
29	        	//如果user为空,表示未登录
30			request.setAttribute("msg","请先登录!");
31			request.getRequestDispatcher("WEB-INF/jsp/login.jsp").
forward(request, response);
32			return false;
33		}
34		@Override
35		public void postHandle(HttpServletRequest arg0, HttpServletResponse 
36	arg1, Object arg2, ModelAndView arg3) throws Exception {
37		}
38	
39		@Override
40		public void afterCompletion(HttpServletRequest arg0,  
41	HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception{
42		}
43	}

在文件14.8的preHandle()方法中,首先获取了请求的URL,然后通过indexOf()方法判断URL中是否有“/toLogin”或“/login”字符串。如果有,就返回true,即直接放行;如果没有,就继续向下执行拦截处理。接下来获取了Session中的用户信息,如果Session中包含用户信息,就表示用户已登录,直接放行即可;否则会转发到登录页面,不再执行该方法中的后续程序。

 在配置文件的<mvc: interceptors>元素中,配置自定义的登录拦截器信息,代码如下所示:

<mvc:interceptor><mvc:mapping path="/**" /><bean class="com.ssm.interceptor.LoginInterceptor" />
</mvc:interceptor>

 在WEB-INF目录下的jsp文件夹中,创建一个管理主页面main.jsp。在该页面中,使用EL表达式获取用户信息,并通过一个超链接来实现“退出”功能,如文件14.9所示。

文件14.9  main.jsp

01	<%@ page language="java" contentType="text/html; charset=UTF-8"
02	    pageEncoding="UTF-8"%>
03	<!DOCTYPE HTML>
04	<html>
05	 <head>
06	  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07	  <title>管理主页</title>
08	 </head>
09	 <body>
10		当前用户信息:${user_session.username}
11		<a href="${pageContext.request.contextPath}/logout">退出</a>
12	 </body>
13	</html>

在WEB-INF目录下的jsp文件夹中,创建一个登录页面login.jsp,在页面中编写一个用于实现登录操作的Form表单,如文件14.10所示。

文件14.10  login.jsp

01	<%@ page language="java" contentType="text/html; charset=UTF-8"
02	    pageEncoding="UTF-8"%>
03	<!DOCTYPE HTML>
04	<html>
05	 <head>
06	   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07	 <title>用户登录</title>
08	 </head>
09	 <body>
10		 <font style="color:Red;">${msg }</font>
11	     <form action="${pageContext.request.contextPath}/login" method="post">
12		登录名:<input type="text" name="username" id="username" /> <br />
13		密&nbsp;&nbsp;&nbsp;&nbsp;码:
14		<input type="password" name="password" id="password" /> <br />
15		<input type="submit" value="登录" />	
16		 </form>
17	 </body>
18	</html>

发布并启动项目,在浏览器中访问地址http://localhost:8080/ chapter14_war_exploded/main,程序正确执行后,其页面显示效果如图14.6所示。

图14.6  执行后login.jsp页面的显示结果

从图14.6所示的结果可以看出,当用户未登录而直接访问主页面时,访问请求会被登录拦截器拦截,从而跳转到登录页面,并提示用户未登录信息。如果在“登录名”输入框中输入“zhangsan”,“密码”输入框中输入“123456”,当单击“登录”按钮后,浏览器的显示结果如图14.7所示。

图14.7  执行后login.jsp页面的显示结果

当输入正确的用户名“wujit”和密码“123456”,并单击“登录”按钮后,浏览器会跳转到管理主页面,如图14.8所示。在单击图14.8所示页面中的“退出”链接后,用户即可退当前管理页面,复位向到登录页面。

图14.8  执行后main.jsp页面的显示结果


http://www.ppmy.cn/ops/151515.html

相关文章

使用 Hadoop 实现大数据的高效存储与查询

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

什么是DNS缓存?DNS缓存有什么用?

DNS缓存在DNS解析过程中发挥了重要作用&#xff0c;有效提升了解析速度和访问体验。那什么是DNS缓存&#xff0c;DNS缓存有什么用呢&#xff1f;接下来国科云简单介绍下。 什么是DNS缓存&#xff1f; 标准的DNS解析过程&#xff0c;需要进行全球递归查询&#xff0c;依次去请…

word合并

手动方法&#xff1a; Word拆分生成多个文档与合并多个文档&#xff0c;多人协作办公必备技巧_Word联盟 java方法1_Spire.Doc for Java 优点&#xff1a;那是真简单&#xff0c;五行代码搞定。 缺点&#xff1a;付款哦&#xff0c;导包问题独立仓库 Java 合并 Word 文档 &…

你会选择java还是node做后台管理

目前后台开源千千万&#xff0c;但说好用且容易上手的也就那几个。 node和java就看你怎么选了 如果你擅长Java&#xff0c;那RuoYi首选 RuoYI后台管理系统https://gitee.com/y_project/RuoYi-Vue有vue2又有vue3。MIT协议全免费开源&#xff0c;功能齐全&#xff01; 如果你擅…

设计模式(4)行为模式

行为模式 1. Chain of Responsibility Pattern&#xff08;责任链模式&#xff09;2.Command Pattern&#xff08;命令模式&#xff09;3.Interpreter Pattern&#xff08;解释器模式&#xff09;▲4.Iterator&#xff08;迭代器模式&#xff09;5.Mediator&#xff08;中介者模…

《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维护与修理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维护与修理》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国汽车维修行业协会 …

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器&#xff0c;用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全&#xff1a; 一、安装Tomcat 下载 访问Apache Tomcat官方网站&#xff08;https://tomcat.apache.org/&#xff09;&#xff0c;根据你的操作系统&#xf…

服务器数据恢复—Zfs文件系统数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台zfs文件系统的服务器&#xff0c;管理员误操作删除了服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有硬盘做好标记后取出&#xff0c;硬件工程师检测后没有发现有硬盘存在硬件故障。以只读方式将所有硬盘…