SpringBoot之HandlerInterceptor拦截器的使用详解

SpringBoot之HandlerInterceptor拦截器的使用详解

这篇文章主要介绍了跳羚之手柄接收器拦截器的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

平常项目开发过程中,会遇到登录拦截,权限校验,参数处理,防重复提交等问题,那拦截器就能帮我们统一处理这些问题。

一、实现方式

1.1 自定义拦截器

自定义拦截器,即拦截器的实现类,一般有两种自定义方式:

定义一个类,实现org。spring框架。网络。servlet。处理者接受器接口。

定义一个类,继承已实现了手柄接收器接口的类,例如org。spring框架。网络。servlet。处理程序。处理器接收器适配器抽象类。

1.2 添加Interceptor拦截器到WebMvcConfigurer配置器中

自定义配置器,然后实现webmvc配置器配置器。

以前一般继承org。spring框架。网络。servlet。配置。注释。webmvcconfigureradapter类,不过SrpingBoot 2.0以上WebMvcConfigurerAdapter类就过时了。有以下2中替代方法:

直接实现org。spring框架。网络。servlet。配置。注释。webmvc配置器接口。(推荐)

继承org。spring框架。网络。servlet。配置。注释。webmvc配置支持类。但是继承webmvc配置支持会让跳羚对手动音量调节的自动配置失效。不过目前大多数项目是前后端分离,并没有对静态资源有自动配置的需求,所以继承webmvc配置支持也未尝不可。

二、HandlerInterceptor 方法介绍

预处理:预处理,在业务处理器处理请求之前被调用,可以进行登录拦截,编码处理、安全控制、权限校验等处理;

默认布尔预处理(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)引发异常{

返回真实的

}

后处理:后处理,在业务处理器处理请求执行完成后,生成视图之前被调用。即调用了服务并返回ModelAndView,但未进行页面渲染,可以修改ModelAndView,这个比较少用。

默认void post句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序,

@可空模型和视图模型和视图)引发异常{

}

完工后:返回处理,在调度员服务网完全处理完请求后被调用,可用于清理资源等。已经渲染了页面。

完成后默认void(http servlet请求请求,HttpServletResponse响应,对象处理程序,

@可空异常(例如)抛出异常{

}

三、拦截器(Interceptor)实现

3.1 实现HandlerInterceptor

此拦截器演示了通过注解形式,对用户权限进行拦截校验。

包com。没人。截击机;

导入com。没人。注释。用户验证;

导入com。没人。语境。用户上下文;

导入com。没人。语境。usercontextmanager

导入com。没人。例外。restapierror

导入com。没人。例外。rest异常;

导入龙目岛。外部人员。SLF 4j。SLF 4j;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。刻板印象。组件;

导入org。spring框架。网络。方法。处理程序方法;

导入org。spring框架。网络。servlet。处理者受体;

导入org。spring框架。网络。servlet。模型和视图;

导入javax。servlet。http。http servlet请求;

导入javax。servlet。http。http servlet响应;

/**

* @描述

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@Slf4j

@组件

公共类用户权限拦截器实现handler接受器{

private UserContextManager UserContextManager;

@自动连线

public void setContextManager(UserContextManager UserContextManager){

这个。userContextManager=userContextManager;

}

@覆盖

公共布尔预处理(HttpServletRequest请求,HttpServletResponse响应,

对象处理程序){

日志。info( UserPermissionInterceptor preHandle-);

HandlerMethod方法的处理程序实例){

处理器方法处理器方法=(处理器方法)处理程序;

//获取用户权限校验注解(优先获取方法,无则再从类获取)

用户验证用户验证=

handlerMethod.getMethod().获取注释(用户验证。类);

if (null==userAuthenticate) {

用户身份验证=处理程序方法。获取方法().getDeclaringClass()。获取注释(用户验证。类);

}

if (userAuthenticate!=空用户身份验证。permission()){

//获取用户信息

用户上下文用户上下文=用户上下文管理器。获取用户上下文(请求);

//权限校验

if (userAuthenticate.type()!=userContext.getType()) {

//如若不抛出异常,也可返回错误的

抛出新的RestException(RestAPIError .AUTH _错误);

}

}

}

返回真实的

}

@覆盖

公共void post句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序,

ModelAndView modelAndView) {

日志。info( UserPermissionInterceptor post句柄-);

}

@覆盖

完成后公共void(http servlet请求请求,HttpServletResponse响应,

对象处理程序,异常例如){

日志。info( UserPermissionInterceptor after completion-);

}

}

3.2 继承HandlerInterceptorAdapter

包com。没人。截击机;

导入javax。servlet。http。http servlet请求;

导入javax。servlet。http。http servlet响应;

导入org。spring框架。刻板印象。组件;

导入龙目岛。外部人员。SLF 4j。SLF 4j;

导入org。spring框架。网络。servlet。模型和视图;

导入组织。spring框架。网络。servlet。处理程序。handlerinterceptoradapter

/**

* @描述

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@Slf4j

@组件

公共类user permissioninterceptoradapter扩展HandlerInterceptorAdapter {

@覆盖

公共布尔预处理(HttpServletRequest请求,HttpServletResponse响应,

对象处理程序){

日志。info( UserPermissionInterceptorAdapter preHandle-);

返回真实的

}

@覆盖

公共void post句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序,

ModelAndView modelAndView) {

日志。info( UserPermissionInterceptorAdapter post handle-);

}

@覆盖

完成后公共void(http servlet请求请求,HttpServletResponse响应,

对象处理程序,异常例如){

日志。info( UserPermissionInterceptorAdapter after completion-);

}

}

四、配置器(WebMvcConfigurer)实现

4.1 实现WebMvcConfigurer(推荐)

包com。没人。配置;

导入com。没人。语境。usercontextresolver

导入com。没人。截击机。用户权限拦截器;

导入com。没人。截击机。userpermissioninterceptoradapter;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。语境。注释。配置;

导入组织。spring框架。网络。方法。支持。handlermethodargumentresolver

导入组织。spring框架。网络。servlet。配置。注释。拦截器注册表;

导入org。spring框架。网络。servlet。配置。注释。webmvc配置器;

导入Java。util。列表;

/**

* @描述

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@配置

公共类WebAppConfigurer实现webmvc配置器{

私有user permission interceptor user permission interceptor;

私有UserPermissionInterceptorAdapter;

私有UserContextResolver UserContextResolver;

@自动连线

public void setUserPermissionInterceptor(UserPermissionInterceptor UserPermissionInterceptor){

这个。userPermissionInterceptor=userPermissionInterceptor;

}

@自动连线

public void setUserPermissionInterceptorAdapter(

UserPermissionInterceptorAdapter UserPermissionInterceptorAdapter){

这个。userPermissionInterceptorAdapter=userPermissionInterceptorAdapter;

}

@自动连线

public void setUserContextResolver(UserContextResolver UserContextResolver){

这个。userContextResolver=userContextResolver;

}

@覆盖

public void addInterceptors(InterceptorRegistry注册表){

//可以添加多个拦截器,一般只添加一个

//addPathPatterns(/** )表示对所有请求都拦截

//.排除路径模式(/base/index )表示排除对/base/index请求的拦截

//多个拦截器可以设置命令顺序,值越小,预处理越先执行,后处理和完工后越后执行

//订单默认的值是0,如果只添加一个拦截器,可以不显示设置命令的值

注册表。添加拦截器(userPermissionInterceptor).addPathPatterns(/** )。排除路径模式(/base/index ).订单(0);

//注册表。添加拦截器(userPermissionInterceptorAdapter).addPathPatterns(/** )

//.排除路径模式(/base/index ).订单(1);

}

@覆盖

public void addArgumentResolvers(listnhandlermethodargumentresolvers){

解析器。add(userContextResolver);

}

}

4.2 继承WebMvcConfigurationSupport

包com。没人。配置;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。语境。注释。配置;

导入组织。spring框架。网络。servlet。配置。注释。拦截器注册表;

导入org。spring框架。网络。servlet。配置。注释。webmvcconfigurationsupport

导入com。没人。截击机。用户权限拦截器;

导入com。没人。截击机。userpermissioninterceptoradapter;

/**

* @描述

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@配置

公共类WebAppConfigurerSupport扩展了webmvc配置支持{

@自动连线

私有user permission interceptor user permission interceptor;

//@自动连线

//private UserPermissionInterceptorAdapter UserPermissionInterceptorAdapter;

@覆盖

public void addInterceptors(InterceptorRegistry注册表){

//可以添加多个拦截器,一般只添加一个

//addPathPatterns(/** )表示对所有请求都拦截

//.排除路径模式(/base/index )表示排除对/base/index请求的拦截

注册表。添加拦截器(userPermissionInterceptor).addPathPatterns(/** )。排除路径模式(/base/index );

//注册表。添加拦截器(userPermissionInterceptorAdapter).addPathPatterns(/** )

//.排除路径模式(/base/index );

}

}

五、其他主要辅助类

5.1 用户上下文类

包com。没人。语境;

导入com。没人。伊努斯。authenticationtype枚举;

进口龙目岛。吸气剂;

进口龙目岛。二传手;

进口龙目岛ToString

/**

* @描述用户上下文

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@Getter

@Setter

@ToString

公共类用户上下文{

//用户名称

私有字符串名称;

//用户身份证明

私有字符串使用者辩证码

//用户类型

私有认证类型枚举类型;

}

5.2 校验访问权限注解

包com。没人。语境;

导入com。没人。伊努斯。authenticationtype枚举;

进口龙目岛。吸气剂;

进口龙目岛。二传手;

进口龙目岛ToString

/**

* @描述用户上下文

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@Getter

@Setter

@ToString

公共类用户上下文{

//用户名称

私有字符串名称;

//用户身份证明

私有字符串使用者辩证码

//用户类型

私有认证类型枚举类型;

}

5.3 用户上下文操作类

包com。没人。语境;

导入com。没人。伊努斯。authenticationtype枚举;

导入com。没人。例外。restapierror

导入com。没人。例外。rest异常;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。刻板印象。组件;

导入org。spring框架。util。字符串实用程序;

导入javax。servlet。http。曲奇;

导入javax。servlet。http。http servlet请求;

导入javax。servlet。http。http servlet响应;

导入Java。util。对象;

导入Java。util。uuid

/**

* @描述用户上下文操作类

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@组件

公共类UserContextManager {

私有静态最终字符串COOKIE _ KEY= _ _ userToken

//@自动连线

//private redis service redis service;

/**

* 获取用户上下文信息

*

* @param请求

* @返回

*/

公共用户上下文getuser上下文(http servlet请求请求){

字符串user token=getuser token(request,COOKIE _ KEY);

如果(!字符串实用程序。isempty(用户令牌)){

//从缓存或者第三方获取用户信息

//String userContextStr=redis service。getstring(用户令牌);

//如果(!字符串实用程序。isempty(userContextStr)){

//返回JSON。解析对象(userContextStr,用户上下文。类);

//}

//因为演示,没集成Redis,故简单新的对象

用户上下文user context=新用户上下文();

用户上下文。setname(无名先生);

用户上下文。设置用户标识( 0000001 );

用户上下文。settype(authenticationtype枚举.ADMIN);

返回用户上下文

}

抛出新的RestException(RestAPIError .AUTH _错误);

}

公共字符串getuser令牌(http servlet请求请求,字符串cookieKey) {

cookie[]cookie=请求。获取cookie();

if (null!=cookies

for(Cookie Cookie:Cookie){

如果(对象。等于(cookie。getname()、cookieKey)) {

返回饼干。getvalue();

}

}

}

返回空

}

/**

* 保存用户上下文信息

*

* @param响应

* @param userContextStr

*/

公共void保存用户上下文(http servlet响应响应,字符串userContextStr) {

//用户代币实际根据自己业务进行生成,此处简单用UUID

字符串用户令牌=uuid。随机uuid().toString();

//设置甜饼干

Cookie cookie=新Cookie(COOKIE_KEY,用户令牌);

饼干。设置路径(“/”);

回应。添加cookie(曲奇);

//redis缓存

//redis服务。setstring(用户令牌,userContextStr,3600);

}

}

5.4 方法参数解析器类

包com。没人。语境;

导入龙目岛。外部人员。SLF 4j。SLF 4j;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。核心。方法参数;

导入org。spring框架。刻板印象。组件;

导入org。spring框架。网络。绑定。支持。webdatabinderfactory

导入组织。spring框架。网络。语境。请求。nativewebrequest

导入组织。spring框架。网络。方法。支持。handlermethodargumentresolver

导入org。spring框架。网络。方法。支持。modelandviewcontainer

导入javax。servlet。http。http servlet请求;

/**

* @描述对有用户上下文参数的接口,进行拦截注入用户信息

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@组件

@Slf4j

公共类UserContextResolver实现HandlerMethodArgumentResolver {

@自动连线

private UserContextManager UserContextManager;

@覆盖

公共对象解析参数(方法参数参数,ModelAndViewContainer MAV容器,

NativeWebRequest,WebDataBinderFactory绑定器工厂){

日志。信息(解决参数-开始. );

http servlet请求request=webrequest。getnative请求(http servlet请求。类);

//从缓存获取用户信息赋值到接口参数中

返回usercontextmanager。getuser上下文(请求);

}

/**

* 只对用户上下文参数进行拦截赋值

*

* @param方法参数

* @返回

*/

@覆盖

公共布尔支持参数(方法参数方法参数){

if(方法参数。getparametertype().equals(UserContext.class)) {

返回真实的

}

返回错误的

}

}

六、测试验证

包com。没人。控制器;

导入com。阿里巴巴。快速JSON。JSON

导入com。没人。注释。用户验证;

导入com。没人。语境。用户上下文;

导入com。没人。语境。usercontextmanager

导入com。没人。伊努斯。authenticationtype枚举;

导入com。没人。POJO。模型。一般结果;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。网络。绑定。注释。获取映射;

导入org。spring框架。网络。绑定。注释。请求映射;

导入org。spring框架。网络。绑定。注释。休息控制器;

导入javax。servlet。http。http servlet响应;

/**

* @描述

* @作者无名先生

* @日期2020年10月25日

* @版本1.0

*/

@RestController

@RequestMapping(用户)

公共类用户控制器{

@自动连线

private UserContextManager UserContextManager;

@GetMapping(login )

public result user context dol log in(http servlet response)& gt;

用户上下文用户上下文=新用户上下文():

用户上下文。setuid( 0000001 );

用户上下文。集名(无名先生);

用户上下文。settype(authenticationtypeenum).管理员(管理员):

用户上下文管理器。saveusercontext(response、JSON。tojsconstraint(用户上下文));

返回一般结果。genuccesresult(用户上下文):

}

@ get apping( personal ).

@用户身份验证(权限=真,类型=AuthenticationTypeEnum).管理员)

公共结果用户上下文getpersortinfo(用户上下文用户上下文)

返回一般结果。genuccesresult(用户上下文):

}

}

启动服务后,在浏览器先调用personal接口,因为没有登录,所以会报错没有权限:

美元

控制台输出:

美元

启动服务后,在浏览器先访问登录到接口进行登录,再访问工作人员接口,验证通过,正确返回用户信息:

七、Github项目

美元

项目工程可从吉卜赛人获取,339 github。com/luciochin/spring boot-common。饭桶

到此这篇关于跳船之处理程序侦听程序拦截器的使用详解的文章就介绍到这了,更多相关跳羚处理程序拦截器拦截器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

SpringBoot之HandlerInterceptor拦截器的使用详解