SpringBoot实现登录拦截器

SpringBoot实现登录拦截器

对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在SpringBoot开发的项目中,通过实现拦截器来实现用户登录拦截并验证。

1、SpringBoot实现登录拦截的原理

SpringBoot通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过@Configuration注解注入配置.

1.1、实现HandlerInterceptor接口

实现HandlerInterceptor接口需要实现3个方法:preHandlepostHandleafterCompletion.

3个方法各自的功能如下:

package blog.interceptor;import blog.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class UserLoginInterceptor implements HandlerInterceptor {/**** 在请求处理之前进行调用(Controller方法调用之前)*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("执行了拦截器的preHandle方法");try {HttpSession session = request.getSession();//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)User user = (User) session.getAttribute("user");if (user != null) {return true;}response.sendRedirect(request.getContextPath() + "login");} catch (Exception e) {e.printStackTrace();}return false;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作//如果设置为true时,请求将会继续执行后面的操作}/**** 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("执行了拦截器的postHandle方法");}/**** 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("执行了拦截器的afterCompletion方法");}
}

preHandle在Controller之前执行,因此拦截器的功能主要就是在这个部分实现:

  • 检查session中是否有user对象存在;
  • 如果存在,就返回true,那么Controller就会继续后面的操作;
  • 如果不存在,就会重定向到登录界面。就是通过这个拦截器,使得Controller在执行之前,都执行一遍preHandle.
  • 微信搜索公众号:架构师指南,回复:架构师 领取资料 。

1.2、实现WebMvcConfigurer接口,注册拦截器

实现WebMvcConfigurer接口来实现一个配置类,将上面实现的拦截器的一个对象注册到这个配置类中.

package blog.config;import blog.interceptor.UserLoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class LoginConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册TestInterceptor拦截器InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());registration.addPathPatterns("/**"); //所有路径都被拦截registration.excludePathPatterns(    //添加不拦截路径"/login",                    //登录路径"/**/*.html",                //html静态资源"/**/*.js",                  //js静态资源"/**/*.css"                  //css静态资源);}
}

将拦截器注册到了拦截器列表中,并且指明了拦截哪些访问路径,不拦截哪些访问路径,不拦截哪些资源文件;最后再以@Configuration注解将配置注入。

1.3、保持登录状态

只需一次登录,如果登录过,下一次再访问的时候就无需再次进行登录拦截,可以直接访问网站里面的内容了。

在正确登录之后,就将user保存到session中,再次访问页面的时候,登录拦截器就可以找到这个user对象,就不需要再次拦截到登录界面了.

@RequestMapping(value = {"", "/", "/index"}, method = RequestMethod.GET)
public String index(Model model, HttpServletRequest request) {User user = (User) request.getSession().getAttribute("user");model.addAttribute("user", user);return "users/index";
}@RequestMapping(value = {"/login"}, method = RequestMethod.GET)
public String loginIndex() {return "users/login";
}@RequestMapping(value = {"/login"}, method = RequestMethod.POST)
public String login(@RequestParam(name = "username")String username, @RequestParam(name = "password")String password,Model model, HttpServletRequest request) {User user = userService.getPwdByUsername(username);String pwd = user.getPassword();String password1 = MD5Utils.md5Code(password).toUpperCase();String password2 = MD5Utils.md5Code(password1).toUpperCase();if (pwd.equals(password2)) {model.addAttribute("user", user);request.getSession().setAttribute("user", user);return "redirect:/index";} else {return "users/failed";}
}

2、代码实现及示例

代码实现如上所示。

在登录成功之后,将user信息保存到session中,下一次登录时浏览器根据自己的SESSIONID就可以找到对应的session,就不要再次登录了,可以从Chrome浏览器中看到。

图片

3、效果验证

3.1、访问localhost:8081/index页面:

图片

3.2、正确输入用户名和密码登录

图片

3.3、再次访问localhost:8081/index

图片
没有再次被登录拦截器拦截,证明可以保持登录。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章学会如何在 NestJS 中集成 MongoDB 并实现数据的增删改查操作

前言 在现代的Web应用程序开发中,无论是在数据存储、检索、还是数据流转的各个环节,数据库都扮演着极其重要的角色。MongoDB是一个基于分布式文件存储的开源数据库系统,以其高性能、高可用性和易扩展性著称。 作为JavaScript社区最受欢迎的…

java正则表达式大全(参考)

一、校验数字的表达式 1 数字:1$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9])$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9])(.[0-…

普中STM32-PZ6806L开发板(HAL库函数实现-访问多个温度传感器DS18B20)

简介 我们知道多个DS18B20的DQ线是可以被挂在一起的, 也就是一根线上可以访问不同的DS18B20而不会造成数据错乱, 怎么做到的,其实数据手册都有说到, 就是靠64-bit ROM code 进行识别, 也可以理解成Serial Number进行识别, 因为主要差异还是在Serial Numb…

本地git服务器的使用

最后总结一句,用gitlab最省事,管理权限最方便,别像下文一样整了。 Windows上使用: 首先要在windows开发机上生成密钥: 1.安装git,首先去git官网下载git,https://git-scm.com/downloads&#xff…

初学者SkyWalking详细使用文档

SkyWalking使用文档 下载地址:https://skywalking.apache.org/downloads/ 主要下载:skywalking apm(tar) 、agents(tar) 解压: (可选操作): ​ apache-skywalking-apm-bin --&g…

chromium在中文用户名下无法编译的问题

新电脑没有太注意,起用户名的时候用了中文。 在编译chromium104的代码时,因为环境变量有中文导致编译失败: 因为我的电脑默认是使用gbk编码,而不是utf-8编码。 这个问题有三种解决办法: (一)把…

并发编程:线程同步基础:3.2、使用两个线程模拟生产者和消费者执行任务。

目录 主要方法 1、主程序 2、生产者 3、消费者 4、中间队列(主要代码) 5、执行结果 主要方法 wait(); 线程等待notify(); 通知一个等待的线程notifyAll(); 通知所有等待的线程 1、主程序 package xyz.jangle.thread.test.n2_3.synccondition; /…

MySQL——事物

目录 一.发现问题 二.什么时事物 三.事务提交方式 四.事物的常规操作方式 五. 事务隔离级别 1.如何理解隔离性 2.隔离级别 3.查看与设置隔离性 4.读未提交【Read Uncommitted】 5.读提交【Read Committed】 6.可重复读【Repeatable Read】 7.串行化【serializabl…

云卷云舒:大型电信运营商应用软件健康度评估方法

大型电信运营商内均会自建云资源池,并基于云资源池构建自己上层应用软件资源,但是各类上层应用软件的故障频发也给运维工作带来了较大的压力,电信运营商急需一种较完善的方法实现对于应用软件的健康度评测,以进一步指导运维完成应…

14、应用层优化

常见问题 什么东西在消耗系统中每台主机的CPU、磁盘、网络,以及内存资源应用真的需要所有获取到的数据吗应用在处理本应由数据库处理的事情吗应用执行了太多的查询吗应用执行的查询太少吗应用创建了没必要的Mysql连接吗应用对一个Mysql实例创建连接的次数太多了吗应…

unity C# 中一看就会的try-catch-finally、throw

文章目录 1、C# 异常处理原理:2、C# 异常处理实用案例(简化版示例):3、throw关键字 C# 异常处理是一种用于捕获和处理程序运行时错误的机制,它允许程序在遇到不可预见或非正常条件时进行优雅地恢复或失败。C# 中的异常…

MySQL模糊查询详解

MySQL模糊查询详解 一、什么是模糊查询二、MySQL中的模糊查询2.1 使用LIKE关键字2.2 使用正则表达式(REGEXP)2.3 使用BETWEEN AND2.4 使用IN操作符2.5 使用IS NULL操作符 💖The Begin💖点点关注,收藏不迷路&#x1f49…

Rust 圣经 阅读 字符、布尔、单元类型

字符类型(char) Rust 的字符不仅仅是 ASCII ,还包含所有的 Unicode 值,包括单个的中文、日文、表情符号等等。 Unicode 值的范围从 U0000 ~ UD7FF 和 UE000 ~ U10FFFF。 因为每个 Unicode 都是 4 个字节编码,所以字符…

【小白专用】c#之FileStream对象读写大文件

提及文件流,不得不先说以下几个类 FileStream,MemoryStream,NetWorkStream,StreamReader,StreamWriter,TextReader,TextWriter 在用这些类之前,我们先来了解一下这些类的用途以及区别…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代,电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台,通过其多样化的商品、便捷的购物体验和创新的商业模式,迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势,以及…

设计模式 七大原则

1.单一职责原则 单一职责原则(SRP:Single responsibility principle)又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合)。 描述: 类被修改的几率很大,因此应该专注…

CNN——VGG

1.VGG简介 论文下载地址:https://arxiv.org/pdf/1409.1556.pdf VGGNet 是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军&#xff…

Prometheus 监控docker

查看docker运行状态 docker stats 启动docker cadvisor 直接运行docker docker run -d \--volume/:/rootfs:ro \--volume/var/run:/var/run:rw \--volume/sys:/sys:ro \--volume/var/lib/docker/:/var/lib/docker:ro \--publish8080:8080 \--namecadvisor \gcr.io/cadvisor…

2024年MySQL学习指南(二),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言4. DDL- 操作数据库4.1 查询4.2 创建数据库4.3 删除数据库4.4 使用数据库 5. DDL- 操作数据表5.1 数据类型5.2 查询表5.3 创建表5.4 删除表5.5 修改表 6. 实战案例详解 前言 接上一篇文章【2024年MySQL学习指南(一)】 4. DDL- 操作数据库 …

2023-2024 年广东省职业院校技能大赛高职组 “软件测试”赛项竞赛规程

2023-2024 年广东省职业院校技能大赛(高职组) “软件测试”赛项竞赛规程 一、赛项信息 赛项名称:软件测试 赛项编号:GZ034 赛项组别:高职组 二、竞赛目标 软件是新一代信息技术的灵魂,是数字经济发展的基础…