【SpingBoot拦截器】实现两个接口,配置拦截路径

news2024/11/24 12:49:54

文章目录

    • SpingBoot拦截器
      • 拦截器与过滤器的区别:
      • 1.HandlerInterceptor接口
      • 2.WebMvcConfigurer接口
      • 3.示例:

SpingBoot拦截器

【SpringWeb框架中的拦截器作用类似于过滤器,都可以对一个请求进行拦截处理。】

我们可以用拦截器做很多事情:

  • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计等;
  • 权限检查:如登录校验,在处理器处理之前先判断是否已经登录;
  • 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
  • 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的都可以用拦截器来实现。

拦截器与过滤器的区别:

过滤器:

  • servlet规范中的一部分,任何java web程序都可以使用。
  • 在url-pattern中配置之后,可以对所要访问的资源进行拦截。

拦截器:

  • 拦截器在SpringMvc框架自己的,只有使用了SpringMvc框架工程才能使用。
  • 拦截器只会拦截访问控制器的方法,如果访问的是js,css,image…是不会进行拦截的。

1.HandlerInterceptor接口

SpringBoot中拦截器的接口名称是HandlerInterceptor,接口里有三个方法:

方法说明:

  • preHandle:在业务处理器Controller处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
  • postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
  • afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
public interface HandlerInterceptor {
    /**
     * preHandle是请求执行前执行的
     */
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	/**
     * postHandler是请求结束,在DispatcherServlet 渲染视图之前执行的,
     * 当preHandle返回true才会执行
     */
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
	 /**
     * afterCompletion是视图渲染完成后才执行
     */
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

2.WebMvcConfigurer接口

WebMvcConfigurer接口配置拦截路径

三种方式:

  1. 继承WebMvcConfigurerAdapter spring5.0 以弃用,不推荐
  2. 实现WebMvcConfigurer 推荐
  3. 继承WebMvcConfigurationSupport 会导致springboot自动配置失效
public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(拦截xxx)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/logout");
    }
  • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
  • addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
  • excludePathPatterns:用于设置不需要拦截的过滤规则

3.示例:

https://www.jb51.net/article/198236.htm

此处做一个做一个简单的拦截范例:
▶创建拦截器的:实现HandlerInterceptor接口

@Component
public class LoginInterceptor implements HandlerInterceptor {
	//这里只用了两个方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行preHandle方法");
        return true;
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("执行afterCompletion方法");
    }
}

▶配置拦截:implements WebMvcConfigurer

/**
 * 拦截器配置类
 */
@Configuration
public class WebJavaBeanConfiguration implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/logout");
    }

}

▶Controller类:登录和安全退出时,不拦截,其他请求拦截

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping ("/findUserById")
    public String findUserById() {
        return "根据ID获取单个对象信息";
    }

    @PostMapping("/login")
    public String login(String uname,String pwd) {
        System.out.println("名字==="+uname);
        System.out.println("密码==="+pwd);
        return "登录成功";
    }
}

执行测试:
localhost:8080/user/findUserById,执行了拦截器的方法,说明拦截成功
localhost:8080/user/login?uname=123&pwd=456,正常运行,说明拦截配置成功

在这里插入图片描述


关于测试接口的软件ApiPost7,刚开始下载可能不会使用,出两个图,看下接口的测试,其他功能自己学习。

创建接口:
在这里插入图片描述

配置一些公共的接口前缀和环境:
在这里插入图片描述

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

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

相关文章

使用HTML制作静态网站作业——我的校园运动会(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Java项目:SSM企业门户网站

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台主要用于官网展示,后台主要为管理员管理, 管理员角色包含以下功能: 管理员…

Rook Ceph浅谈

storageclass是最省心的,上面三种删除了容器存储还在 下图是管理员定义pv,用户不知道这些细节 PersistentVolume pv会跟后端的存储rbd对接 用户通过PVC调用PV ,根据10G容量去pv里找相匹配的自动关联 上图就叫 pvc-demo StorageClass 更厉害 管理员…

PostgreSQL 内核可观测性体系

文章目录背景Metricspgstat指标展示指标统计相关的guc 参数pgstat 实现pg_stat_statements基本用法及指标内容pg_stat_statements 实现Trace总结背景 PG 作为一个演讲30多年历史的TP 数据库,其复杂度极高,如果帮助DBA 在线上分析复杂查询的问题或者构建…

Nexus私服(二)

(一) SpringBoot配置Maven发布至Nexus私服 Nexus默认会带有四常用个仓库,maven-central、maven-public、maven-releases、maven-snapshotsmaven-central类型是proxy代理类型,地址是指向maven中央仓库地址https://repo1.maven.org/maven2/maven-releases、…

空间复杂度(Space Complexity)

预计阅读时间:10分钟 一、简介 随着计算机空间的发展,空间复杂度逐渐变得不那么重要了,但它在比赛中仍然存在。 推导方法: 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中,只保留最高阶项。…

[附源码]Python计算机毕业设计Django旅游网的设计与实现

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

2013-2020年全国31省数字经济信息化基础数据

2013-2020年全国31省数字经济信息化基础 1、时间:2013-2020年 2、来源:国家统计J和统计NJ 3、范围:31省 4、指标包括: "光缆线路长度(公里)、移动电话基站(万个)、信息传输、软件和信息技术服务业…

基于模糊BP神经网络轨迹跟踪(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【VUE Cli脚手架软件安装篇】

目录 1. 搭建开发环境 1.1. 安装Node.js 1.2. 配置npm源 2. 安装VUE Cli 3. 创建第1个VUE CLI工程 3.1. 创建工程 3.2. 启动服务 3.3. 停止服务 3.4. 重启服务 1. 搭建开发环境 1.1. 安装Node.js 首先需要下载Node.js安装包,下载地址可参考:ht…

【数据结构】顺序表的概念及实现

顺序表1、顺序表概念2、初始化顺序表3、销毁顺序表4、判断顺序表是否为空5、打印顺序表6、检查顺序表的容量(同时充当扩容任务)7、顺序表的尾插8、顺序表的头插9、顺序表的尾删10、顺序表的头删11、查找顺序表中某个数的位置12、在顺序表pos位置插入数字…

光环:元宇宙概念及生态发展现状与研判——张子良

摘要:文章内容主要来源于光环国际2022年第三届中国科创者大会张子良老师的分享,原分享名称为"元宇宙行业应用实践探索"。讲述了元宇宙的理论知识、元宇宙生态圈及当前发展的情况。提出来看一个概念是否相同可以从引入时间、内容两个方面去界定…

【用python的标准库画出显示实时时间的数码管】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

Java项目:SSM电影售票管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能: 管理员登陆,管理员用户管理,新闻公告增删改查,电影类型增删改查,影院信息增删改查,电影信息增删改查,订单…

计算机网络学习笔记(II)——应用层

文章目录第二章—应用层2.1、应用层原理网络应用的体系结构客服—服务器(C/S)体系结构对等体(P2P)体系结构C/S和P2P体系的混合结构进程通信分布式进程通信需要解决的问题应用层协议Internet传输层提供的服务UDP存在的必要性2.2、W…

【Android插件化框架】插件APK中的动态代理

在 Android 中实现插件化框架,需要解决的问题主要如下: 资源和代码的加载Android 生命周期的管理和组件的注册宿主 APK 和插件 APK 资源引用的冲突解决 下面分析几个目前主流的开源框架 DL 动态加载框架 ( 2014 年底) 是基于代理的方式实现插件框架&…

渗透测试 | APP信息收集

0x00 免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…

【学习笔记76】认识ajax和ajax的请求

一、认识前后端交互 1、前后端交互 前端向后端发送请求, 索要数据因为前端没有办法存储大量数据, 所以数据都存储在后端当前端需要数据时, 需要向后端发送请求, 得到想要的数据 2、什么是ajax ajax全名async javascript and XML(异步JavaScript和XML)是前后台交互的能⼒&#…

手摸手带你撸一个拖拽效果

目录 前言 准备 创建所需要结构 编写样式 js编写拖拽效果 解释方法 所有代码 结尾 前言 最近看见一个拖拽效果的视频,看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然的心理&#xf…

【疯狂世界杯】css 动画实现跳动的足球

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言📝…