Java 拦截器

article/2025/10/20 11:47:00

一、引言

  既然要用拦截器,首先先得简单了解一下什么是拦截器:

  概念:java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。

  作用域:动态拦截Action调用的对象(也就是我们的controller层)

  我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法前都加上登录代码...【emmm....我想应该不会有人这么干吧...】,常见的可以使用以下几种方式:

  • 使用AOP切面功能来实现
  • 使用Spring的拦截器相关接口来自定义拦截器
    • 实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法【配置拦截器】
    • 实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter,重写preHandle()方法【自定义拦截器】

  下面我们就一起来看下一下怎么实现吧~

二、代码实现

AOP切面方式

   切面方式配置的话,得配置到包路径下或者每个具体方法都要配置,个人不是很喜欢用切面的方式来配置拦截器,用来记录日志或者其他功能可以使用aop,这篇文章就不详细讲解了,只简单说明一下以切面方式实现时的大致模型,我们着重看下以另一种方式来实现拦截器的功能。

实现WebMvcConfigurer接口的方式

  WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些HandlerInterceptorViewResolverMessageConverter

  基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口。在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport。

  简单介绍一下WebMvcConfigurer中比较重要的几个方法:

  • addInterceptors添加拦截器
  • addCorsMappings跨域
  • addViewControllers页面跳转(不用像现在我们要写一个Controller进行映射就可实现跳转)
  • addResourceHandlers静态资源(自定义静态资源映射目录)
  • configureDefaultServletHandling默认静态资源处理器
  • configureViewResolvers视图解析器(配置请求视图映射,配置了以后我们返回一个页面路径的字符串时,解析器会帮我们拼装前缀和后缀等信息)
  • configureMessageConverters信息转换器(比如我们入参的信息直接转换成json或者转换成对应的bean类就具体在这里配置)

  这里我们主要应用的是前两个方法,添加拦截器和跨域配置,下面来看下具体实现:

 拦截器配置源码:


/*** 拦截器的属性配置** @Author 有梦想的肥宅*/
@Configuration//标识这是一个配置类
public class InterceptorConfiguration implements WebMvcConfigurer {/*** 重写addCorsMappings()解决跨域问题* 配置:允许http请求进行跨域访问** @param registry* @Author 有梦想的肥宅*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//指哪些接口URL需要增加跨域设置.allowedOrigins("*")//指的是前端哪些域名被允许跨域.allowCredentials(true)//需要带cookie等凭证时,设置为true,就会把cookie的相关信息带上.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//指的是允许哪些方法.maxAge(3600);//cookie的失效时间,单位为秒(s),若设置为-1,则关闭浏览器就失效}/*** 重写addInterceptors()实现拦截器* 配置:要拦截的路径以及不拦截的路径** @param registry* @Author 有梦想的肥宅*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册Interceptor拦截器(Interceptor这个类是我们自己写的拦截器类)InterceptorRegistration registration = registry.addInterceptor(new Interceptor());//addPathPatterns()方法添加需要拦截的路径registration.addPathPatterns("/**");                      //所有路径都被拦截//excludePathPatterns()方法添加不拦截的路径registration.excludePathPatterns(                         //添加不拦截路径"/demo/loginPage",            //登录页面的地址【不拦截】"/**/*.html",            //html静态资源"/**/*.js",              //js静态资源"/**/*.css"              //css静态资源);}
}

自定义拦截器源码:

/*** 拦截器* @Author 有梦想的肥宅*/
public class Interceptor implements HandlerInterceptor {/*** 在请求处理之前进行调用(Controller方法调用之前)* @Author 有梦想的肥宅*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("执行了Interceptor的preHandle方法");try {//统一拦截(查询当前session是否存在UserInfoVO用户信息)(这里UserInfoVO会在每次登陆成功后,写入session)UserInfoVO user = (UserInfoVO) request.getSession().getAttribute("UserInfoVO");if (user != null) {return true;}//这里设置拦截以后重定向的页面,一般设置为登陆页面地址response.sendRedirect(request.getContextPath() + "/demo/loginPage");} catch (IOException e) {e.printStackTrace();}return true;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作//如果设置为true时,请求将会继续执行后面的操作}
}

小结:从上面的代码可以看出,要实现拦截器一般需要以下几个步骤:

  • 1、写一个实现了WebMvcConfigurer接口的配置类
  • 2、重写其中的addCorsMappings()方法【配置跨域信息】和addInterceptors()方法【配置拦截器信息,如拦截路径和开放路径等】
  • 3、写一个实现HandlerInterceptor接口的自定义拦截器
  • 4、重写其中的preHandle()方法,方法内容为拦截到请求后的处理

http://chatgpt.dhexx.cn/article/Bjvq7b49.shtml

相关文章

VirtualAPK:滴滴 Android 插件化的实践之路

作者简介: 任玉刚,滴滴出行 Android 技术专家,《Android 开发艺术探索》作者,插件化框架 dynamic-load-apk 的发起者,CSDN 移动开发博客专家,曾当选 CSDN 2014、2015年度十大博客之星。热爱技术&#xff0c…

Unity刚体

1、Dynamic:动态类型 受重力和力的影响移动和旋转 Material: 物理材质,在刚体上设置了物理材质,如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置,将使用在Physics 2D窗口中设置的默认材质(Physi…

android view 的测量过程

参考任玉刚主席的《android开发艺术探索》所写。

2017年终总结,开始写博客的第一年

结束校园生活,开始工作 今年是我开始工作的第一年,前半个学期实习阶段,开发了三个上线的应用,之前在学校的时候,做过不少练手的项目,有时心血来潮,还做了一些自己认为有趣的项目,但是…

阿里组织新调整:张勇兼任云业务总裁“敏捷组织”是内核

雷递网 雷建平 12月29日 岁末年初之际,在小米进行管理层调整后,阿里巴巴也进行了新一轮调整。 12月29日,阿里巴巴集团董事会主席兼CEO张勇发布内部邮件,宣布张建锋不再担任阿里云总裁,继续担任阿里达摩院院长&#xff…

鲲鹏院武志强课题组诚聘博士后

诚聘英才 Recruitment Season 佛山鲲鹏现代农业研究院 研究院简介 佛山鲲鹏现代农业研究院(以下简称“鲲鹏院”)成立于2021年,由中国农业科学院与佛山市人民政府、南海区人民政府依托中国农业科学院(深圳)农业基因组研…

刚体

概述 在整个 Unity 物理系统中,最重要概念就是刚体 Rigidbody。 刚体是物理学中的概念,它是指在运动中和受力后,形状和大小不变,并且内部各点相对位置不变的物体。刚体是一种为了方便物理计算而提出的理想化模型,在不…

技术人员如何从容转型项目经理?

科技在发展,时代在进步,项目越来越复杂,越来越多的技术人员面临技术转型,那么,如何成功转型成了众多技术人员面临的新挑战。 首先我们必须要搞清楚,为什么需要技术人员转型项目经理?项目经理不…

阿里云杨国彦:云上护航,陪伴成长

以下整理自杨国彦在云栖大会“云上成就创新梦想”论坛中发表的《云上护航,陪伴成长》的主题演讲) 11月5日,以“云上成就创新梦想”为主题的中小企业云上创新论坛在浙江杭州云栖小镇举行,论坛聚集政府、资本、媒体、机构等相关领导…

滴滴技术专家任玉刚:让你的职业迷茫从哪来回哪去

今天给大家推荐的是《Android开发艺术探索》的作者(滴滴技术专家)任玉刚老师的直播课,感兴趣的同学可以通过文末的方式参与本次活动(喜欢的同学欢迎转发)。 我是任玉刚, 我来我想说。 01 收到过无数同学的…

从菜鸟到资深工程师的进阶之路

专访任玉刚:从菜鸟到资深工程师的进阶之路 发表于 2015-12-22 08:25| 11131次阅读| 来源 CSDN| 31 条评论| 作者 夏夏 专访 iOS Android 任玉刚 开发者 CSDN博客 allowtransparency"true" frameborder"0" scrolling"no" src"h…

kafka sasl_ssl配置

一、切换到存储证书的路径 我这里在家目录中的创建了ssl文件夹 mkdir ssl && cd ssl 二、生成服务端密钥库 keytool -keystore server.keystore.jks -alias localhost -validity 365 -genkey验证证书: keytool -list -v -keystore server.keystore.jks …

KAFKA SASL配置 记录

kafka配置SASL 第1步 将kafka_client_jaas.conf/kafka_server_jaas.conf/kafka_zoo_jaas.conf三个文件放入kafka的config文件夹中,文件中配置用户,superadmin用户必须配置。 kafka_client_jaas.conf内容如下 KafkaClient { …

WIN10 VS2019 编译Cyrus SASL

环境 下载安装Visual Studio 2019 安装时在【工作负载】必须勾选【使用C的桌面开发】下载cyrus-sasl源码 从Github上clone或者下载zip包,我本来是需要2.1.26,但是从从https://www.cyrusimap.org/releases/下载对应版本的源码包编译都有问题,…

Kafka3.0 SASL安全认证

下面主要介绍Kafka两种认证方式 kafka验证方式: SASL/PLAIN:不能动态添加用户配置文件写死账号密码 SASL/SCRAM: 可以动态的添加用户 SASL/PLAIN方式 cd /usr/local/kafka/kafka_2.12-3.0.1/bin/ ## 复制一份saslcp kafka-server-start.…

集成OpenLDAP与Kerberos实现统一认证(三):基于SASL/GSSAPI深度集成

文章目录 1. 写作背景2. 既定目标3. 重要概念3.1 SASL3.2 GSSAPI3.3 SASL与GSSAPI的关系3.4 saslauthd3.5 Kerberos化 4. 核心原理4.1 基于SASL/GSSAPI实现Kerberos账号登录OpenLDAP4.2 基于olcAuthzRegexp规则映射Kerberos与OpenLDAP账号4.3 基于saslauthd进行委托认证 5. 安装…

kafka sasl java_Kafka安装及开启SASL_PLAINTEXT认证(用户名和密码认证)

前些日子要封装一个kafka的客户端驱动,配置了下kafka环境,发现配置复杂度完爆rabbitmq很多倍啊,而且发布订阅模式使用起来也很麻烦,可能就胜在分布式了吧。 kafka需要java环境,自行安装java sdk 1.8. 官方加载安装包&a…

go kafka 配置SASL认证及实现SASL PLAIN认证功能

用户认证功能,是一个成熟组件不可或缺的功能。在0.9版本以前kafka是没有用户认证模块的(或者说只有SSL),好在kafka0.9版本以后逐渐发布了多种用户认证功能,弥补了这一缺陷(这里仅介绍SASL)。 本…

kafka集群开启sasl认证

kafka集群开启sasl认证 sasl认证 sasl 是扩展C/S模式验证能力的一种认证机制。它可以规范客户端和服务端传输应答和传输内容编码,简而言之sasl决定了认证的规则,即客户端如何存储身份证书、客户端与服务端如何校验密码都由sasl决定。当我们的客户端通过…

mysql sasl_SASL认证失败的原因(authentication failed)

SASL认证失败的原因(authentication failed) (2012-06-15 00:45:43) 标签: 杂谈 authentication failed) SASL认证失败的原因可分为如下几个可能的方面: Permission问题:对系统用户的SASL Auth尤其重要,要保证postfix用户(smtpd)对…