SpringBoot中使用拦截器拦截跳转登录详解

文章目录

  • SpringBoot中使用拦截器拦截跳转登录详解
    • 一、引言
    • 二、方法一:基于Session的拦截器
      • 1、拦截器实现
        • 1.1、创建拦截器类
        • 1.2、拦截器配置
      • 2、控制器和视图
        • 2.1、控制器实现
        • 2.2、视图实现
    • 三、方法二:基于异常处理的拦截器
      • 1、拦截器实现
        • 1.1、创建拦截器类
        • 1.2、拦截器配置
      • 2、异常处理
        • 2.1、自定义异常
        • 2.2、全局异常处理
      • 3、登录实现
        • 3.1、控制器登录方法
        • 3.2、业务层登录实现
    • 四、总结

SpringBoot中使用拦截器拦截跳转登录详解

一、引言

在SpringBoot应用中,权限控制是一个重要的功能,它确保了只有经过身份验证的用户才能访问特定的资源。拦截器(Interceptor)是Spring框架提供的一种机制,用于在请求的生命周期中插入自定义逻辑,如身份验证、日志记录等。本文将详细介绍两种在SpringBoot中使用拦截器来控制用户登录并跳转到指定页面的方法,以及它们的实现细节。

二、方法一:基于Session的拦截器

1、拦截器实现

1.1、创建拦截器类

在SpringBoot中,我们可以通过实现HandlerInterceptor接口来创建一个拦截器。preHandle方法是在请求处理之前调用的,如果返回false,则请求将不会继续执行,这正是我们检查用户是否登录的地方。

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {User user = (User) request.getSession().getAttribute("user");if(user == null){request.setAttribute("msg","没有权限");request.getRequestDispatcher("/index").forward(request,response);return false;}else {return true;}}
}
1.2、拦截器配置

接下来,我们需要在WebMvcConfigurer的实现类中注册我们的拦截器,并指定拦截路径和排除路径。

@Configuration
public class WebConfigurer implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/index","/login");}
}

2、控制器和视图

2.1、控制器实现

控制器A01Controller负责处理登录请求,并根据验证结果重定向到不同的页面。

@Controller
public class A01Controller {@RequestMapping("/index")public String test1(){return "amodule/A01";}@PostMapping(value = "/login")public String test2(@RequestParam("username") String username,@RequestParam("password") String password,HttpSession session,Map map){if("123".equals(username) && "123".equals(password)){User user = new User();user.setUser_name(username);user.setPassword(password);session.setAttribute("user",user);return "redirect:/main.html";}else {map.put("msg","账号或密码错误,请重新登录");return "amodule/A01";}}
}
2.2、视图实现

JSP页面A01.jsp作为登录页面,用户在这里输入用户名和密码。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>Title</title><!-- 省略CSS和JS引用 -->
</head>
<body><!-- 登录表单 --><form style="margin-left:500px;margin-top:200px;" action="${pageContext.request.contextPath}/login" method="POST" id="formBtn"><p style="color: red;">${msg}</p><div class="form-group"><label for="user" stype="display:inline;">账户:</label><input type="text" class="form-control" name="username"  id="user" style="display:inline;width:200px;"autocomplete="off" /></div><div class="form-group"><label for="password"  style="display:inline;">密码:</label><input type="text" class="form-control" name="password"  id="password" style="display:inline;width:200px;"autocomplete="off" /></div><button type="submit" class="btn btn-primary">登录</button></form>
</body>
</html>

三、方法二:基于异常处理的拦截器

1、拦截器实现

1.1、创建拦截器类

在第二种方法中,我们同样创建一个拦截器类MyInterceptor,但这次我们在用户未登录时抛出一个自定义异常。

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();Object user = session.getAttribute("user");if (null == user) {throw new LogOutException("用户未登录");}return true;}
}
1.2、拦截器配置

LoginConfig类中注册拦截器,并设置拦截和排除路径。

@Configuration
public class LoginConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());registration.addPathPatterns("/**");registration.excludePathPatterns("/doLoginUI", "/user/doLogin", "/bower_components/**", "/modules/**", "/plugins/**", "/dist/**");}
}

2、异常处理

2.1、自定义异常

创建一个自定义异常LogOutException,用于在用户未登录时抛出。

public class LogOutException extends Exception {public LogOutException() {super();}public LogOutException(String message) {super(message);}
}
2.2、全局异常处理

创建一个全局异常处理类GlobalExceptionHandler,用于捕获并处理拦截器抛出的异常。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(LogOutException.class)public String doLogOutException(LogOutException e) {return "redirect:/doLoginUI";}
}

3、登录实现

3.1、控制器登录方法

在控制器中实现登录逻辑,并在成功登录后将用户信息存储到Session中。

@RequestMapping("/doLogin")
public JsonResult doLogin(String username, String password, HttpServletRequest request) throws Exception {sysUserService.doLogin(username, password);SysUser user = new SysUser();user.setPassword(password);user.setUsername(username);HttpSession session = request.getSession();session.setAttribute("user", user);return new JsonResult("登陆成功");
}
3.2、业务层登录实现

在业务层实现登录逻辑,包括密码的加密和验证。

@Override
public Boolean doLogin(String username, String password) throws Exception {SysUser user = sysUserDao.select(username);if (null == user) {throw new UnknownAccountException("用户名不存在");}SimpleHash sh = new SimpleHash("MD5", password, user.getSalt(), 1);String hashedPassword = sh.toHex();if (!user.getPassword().equals(hashedPassword)) {throw new Exception("密码错误");}return true;
}

四、总结

本文详细介绍了两种在SpringBoot中使用拦截器来控制用户登录并跳转到指定页面的方法。第一种方法是基于Session的检查,适用于大多数需要简单权限控制的场景。第二种方法是基于异常处理,它提供了更灵活的错误处理机制,适用于需要精细控制用户访问权限的复杂应用。两种方法各有优势,开发者可以根据实际需求选择适合的实现方式。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • SpringBoot中使用拦截器拦截跳转登录
  • 登录拦截以及拦截后指定页面跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13352.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

状态空间方程离散化(Matlab符号函数)卡尔曼

// 卡尔曼滤波(4)&#xff1a;扩展卡尔曼滤波 - 知乎 // // matlab 连续系统状态空间表达式的离散化&状态转移矩阵求解_matlab状态方程离散化-CSDN博客 // // // %https://blog.csdn.net/weixin_44051006/article/details/107007916 clear all; clc; syms R1 R2 C1 C…

ubuntu24.04播放语音视频

直接打开ubuntu自带的video播放.mp4文件&#xff0c;弹窗报错如下&#xff1a; 播放此影片需要插件 MPEG-4 AAC 编码器安装方式&#xff1a; sudo apt install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install ffmpeg验证AA…

音视频入门基础:MPEG2-TS专题(4)——使用工具分析MPEG2-TS传输流

一、引言 有很多工具可以分析MPEG2-TS文件/流&#xff0c;比如Elecard Stream Analyzer、PROMAX TS Analyser、easyice等。下面一一对它们进行简介&#xff08;个人感觉easyice功能更强大一点&#xff09;。 二、Elecard Stream Analyzer 使用Elecard Stream Analyzer工具可以…

C++基础 抽象类 类模板 STL库 QT环境

一、抽象类 1、纯虚函数 在多态中&#xff0c;通常父类中虚函数的实现是毫无意义的&#xff0c;主要都是调用子类重写的内容&#xff0c;因此可以将虚函数改为纯虚函数。 语法&#xff1a; virtual 返回值类型 函数名 (参数列表) 0; 2. 抽象类 1) 概念 有纯虚函数所在的类…

c语言选择排序

选择排序思想&#xff1a; 反复地从未排序部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其放到已排序部分的末尾&#xff1b; 首先用一个变量min来保存数组第一个元素的下标&#xff0c;然后用这个下标访问这个元素&#xff0c;将这个元素与它后面的元素相…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…

Golang | Leetcode Golang题解之第560题和为K的子数组

题目&#xff1a; 题解&#xff1a; func subarraySum(nums []int, k int) int {count, pre : 0, 0m : map[int]int{}m[0] 1for i : 0; i < len(nums); i {pre nums[i]if _, ok : m[pre - k]; ok {count m[pre - k]}m[pre] 1}return count }

OpenCompass 评测 InternLM-1.8B 实践

1. API评测 首先我们创建模型的配置文件&#xff0c;我们需要定义评测模型的类型&#xff0c;是OpenAISDK类型&#xff0c;然后是模型名称&#xff0c;请求地址和API等等内容。然后我们通过命令行python run.py --models puyu_api.py --datasets demo_cmmlu_chat_gen.py --deb…

【算法】——二分查找合集

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;二分查找工具 1&#xff1a;最基础模版 2&#xff1a;mid落点问题 一&#xff1a;最…

Python 的 Pygame 库,编写简单的 Flappy Bird 游戏

Pygame 是一个用 Python 编写的开源游戏开发框架&#xff0c;专门用于编写 2D 游戏。它提供了丰富的工具和功能&#xff0c;使得开发者能够快速实现游戏中的图形渲染、声音播放、输入处理和动画效果等功能。Pygame 非常适合初学者和想要快速创建游戏原型的开发者。 Pygame 的主…

Ubuntu上搭建Flink Standalone集群

Ubuntu上搭建Flink Standalone集群 本文部分内容转自如下链接。 环境说明 ubuntu 22.06 先执行apt-get update更新环境 第1步 安装JDK 通过apt自动拉取 openjdk8 apt-get install openjdk-8-jdk执行java -version&#xff0c;如果能显示Java版本号&#xff0c;表示安装并…

【stablediffusion】ComfyUI | 恐怖如斯的放大模型DifFBIR,超分辨率放大、人脸修复、图像去噪 | 效果炸裂 | 强烈推荐

今天&#xff0c;我们将向您介绍一款令人兴奋的更新——Stable Diffusion的ComfyUI放大模型DifFBIR。这是一款基于Stable Diffusion技术的AI绘画工具&#xff0c;旨在为您提供一键式图像放大的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工具都能为您带来极大…

PCB设计基础

系列文章目录 文章目录 系列文章目录前言一、PCB设计术语与定义二、焊盘堆和过孔的构成及分类总结 前言 介绍PCB的基础内容。 一、PCB设计术语与定义 PCB全称为Printed Circuit Board&#xff0c;印刷电路板。它是电子元器件的支撑体&#xff0c;是重要的电子部件以及电气连接…

Node.js下载安装及环境配置教程

一、进入官网地址下载安装包 Node.js 中文网 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js (2)直接点【Next】按钮&#xff0c;此处可根据…

深度学习知识点3-CBAM轻量的注意力模块

论文&#xff1a;&#xff08;2018&#xff09;包含空间注意力和通道注意力两部分1807.06521https://arxiv.org/pdf/1807.06521 通道注意力&#xff1a;对input feature maps每个feature map做全局平均池化和全局最大池化&#xff0c;得到两个1d向量&#xff0c;再经过conv&…

《云原生安全攻防》-- K8s安全防护思路

从本节课程开始&#xff0c;我们将正式进入防护篇。通过深入理解K8s提供的多种安全机制&#xff0c;从防守者的角度&#xff0c;运用K8s的安全最佳实践来保障K8s集群的安全。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全防护思路&#xff1a;掌握K8s自身提…

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…

基于物联网的智能超市快速结算系统

摘 要 当今社会的商品层出不穷&#xff0c;人们因为越来越多大型仓储超市的出现使得生活更加便利&#xff0c;但许多随之而来的新问题也给人们带来了许多的不便&#xff0c;例如商家一直被更换标签不及时、货物丢失、超市内物品更换处理不及时、超市内人流高峰期人流控制不得…

JavaScript面向对象笔记(4)

一、正则表达式 1.正则表达式概述 Regular Expression&#xff1a;是用于匹配字符串组合的模式&#xff0c;再javaScript中&#xff0c;正则表达式也是对象。 正则表达式通常被用来检索、替换某个模式&#xff08;规则&#xff09;的文本。例如&#xff1a;表单校验&#xf…

20241112-Pycharm使用托管的Anaconda的Jupyter Notebook

Pycharm使用托管的Anaconda的Jupyter Notebook 要求 不要每次使用 Pycharm 运行 Jupyter 文件时都要手动打开 Anaconda 的 Jupyter Notebook 正文 pycharm中配置好会自动安装的&#xff0c;有的要自己配置 Pycharm中配置 文件 ——> 设置 ——> 语言和框架……&am…