首页 > 其他分享 >拦截器HandlerInterceptorAdapter使用方法

拦截器HandlerInterceptorAdapter使用方法

时间:2023-02-16 11:37:04浏览次数:33  
标签:拦截器 preHandle request HandlerInterceptorAdapter 拦截 方法 public

原文链接:https://blog.csdn.net/kuishao1314aa/article/details/109777304

一、Interceptor定义:
拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制

1.拦截器(Interceptor)执行顺序:
1. 请求到达 DispatcherServlet
2. DispatcherServlet 发送至 Interceptor ,执行 preHandle
3. 请求达到 Controller
4. 请求结束后,postHandle 执行

2.拦截器(Interceptor)和过滤器(Filter)的执行顺序
过滤前->拦截前->Action处理->拦截后->过滤后

3.使用方法
1)预处理preHandle()方法

用户发送请求时,先执行preHandle()方法。会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则执行用户请求的url方法。

2)后处理postHandle()方法

调用了Service并返回ModelAndView,但未进行页面渲染,可以在这里继续修改ModelAndView

3)返回处理afterCompletion()方法

已经渲染了页面,在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

注:一般使用preHandle这个拦截器进行预处理,对url进行请求拦截


二、Spring Boot配置方式
1.自定义拦截器,需要继承HandlerInterceptorAdapter类

 1 @Component
 2 public class AuthorityInterceptor extends HandlerInterceptorAdapter {
 3 private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class);
 4 
 5 @Override
 6 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 7 logger.info("进入到拦截器中:preHandle() 方法");
 8 System.out.println(request.getServletPath());
 9 return true;
10 }
11 @Override
12 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
13 logger.info("进入到拦截器中:postHandle() 方法中");
14 System.out.println(request.getRequestURI());
15 }
16 
17 @Override
18 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
19 logger.info("进入到拦截器中:afterCompletion() 方法中");
20 System.out.println(request.getServletPath());
21 }
22 }

 

2.注册拦截器,需要继承WebMvcConfigurerAdapter类
需要重写addInterceptors方法,这里是对根目录"/"进行拦截,可以指定拦截url请求目录

@Configuration
public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter {
@Autowired
private AuthorityInterceptor authorityInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry)
{
//注册自己的拦截器并设置拦截的请求路径
registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}

  


3.测试结果
1)用户请求的url如下所示:

 

 

 

2)发送请求,进入到拦截器

 

 

 

 

三、Spring 配置方式
注册拦截器,使用spring mvc来注册,替换上面的1.2步骤

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.vivo.finance.web.interceptor.AuthorityInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

  

四、对指定方法进行拦截或对某些方法不拦截
这里的注册监听器,自定义监听器写法和前面一致。

如果对url目录下所有的请求进行了监听,但需要对某些请求方法不进行拦截或单独拦截,可以采用自定义注解方式,对方法加上自定义注解,拦截器进行扫描,对出现过自定义注解的方法进行单独处理

1.自定义注解
目标为方法,仅在运行时有效LoginSuccess可以在定义中通过反射获取字段值,仅用注解可以不管

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginVerify {
boolean LoginSuccess() default true;
}

 

2.preHandle对自定义注解@LoginVerify进行拦截
preHandle对有@LoginVerify注解的方法进行单独处理

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("进入到拦截器中:preHandle() 方法");
HandlerMethod handlerMethod=(HandlerMethod)handler;
LoginVerify loginVerify=handlerMethod.getMethodAnnotation(LoginVerify.class);
if (loginVerify!=null){
System.out.println(loginVerify.LoginSuccess());
logger.info("不需要对 @loginVerify注解方法 进行拦截");
}else {
logger.info("对非@loginVerify注解方法 进行拦截处理");
System.out.println(request.getServletPath());
System.out.println(request.getParameter("id"));
return true;
}
return true;
}

 


3.自定义注解使用位置
将@LoginVerify注解施加到方法上即可

@LoginVerify(LoginSuccess=false)
@RequestMapping("/test2")
public String testConnection(){
System.out.println("test2");
return "test2";
}

 


4.实现结果
发送请求



标签:拦截器,preHandle,request,HandlerInterceptorAdapter,拦截,方法,public
From: https://www.cnblogs.com/haoran8222/p/17126065.html

相关文章

  • C#调用usb摄像头的实现方法
    C#调用usb摄像头的实现方法2022-11-0112:32Danna_Li C#这篇文章主要介绍了C#调用usb摄像头的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定......
  • java字符串之间的拼接方法
    在java开发中,有很多时候,需要把一个集合或者数组中的数据进行拼接,拼接成一个全新格式的字符串,这时候就用到了java中的一些方法,方法如下:一、Joiner-guava点击查看代码/......
  • php7.3.4 pdo方式连接sqlserver 设置方法
    我这边用的php是7.3.4版本的,大家设置的时候看一下。一、首先要开启php的sqlsrv扩展1.下载SQLSRV58.EXE,我的php版本是7.3.4https://docs.microsoft.com/en-us/sql/conne......
  • 【电脑软件】网络端口被占用情况的解决方法
    使用XXX软件等,出现端口被占用的情况。如1080端口被占用可以通过管理员身份运行CMD查询并关闭占用的进程,并重新开启XXX软件。如下图所示:......
  • 几个提升WPF应用程序冷启动性能的方法,建议收藏!(Part 2)
    在上文中(点击这里回顾>>),我们主要介绍了针对三个技术的WPF应用程序性能提升,本文将着重介绍针对DevExpressWPF界面控件研发的应用程序如何提升性能!PS:有用控件推荐~DevExpre......
  • 常见帧率计算方法实际效果对比及EasyCVR平台的帧率计算方法
    什么是帧、帧数、帧率?帧(Frame) 帧可以理解为视频或者动画中的每一张画面,而视频和动画特效是由无数张画面组合而成,每一张画面都是一帧。帧数(Frames)帧数是帧生成的......
  • zfs 之 `label is missing` 问题解决方法.
    具体报错信息status:Oneormoredevicescouldnotbeusedbecausethelabelismissingorinvalid.Sufficientreplicasexistforthepooltocontinue......
  • 杂七杂八的工具方法
    判断当前代码运行环境constisBrowser=typeofwindow==='object'&&typeofdocument==='object';清除所有CookiesconstclearCookies=()=>document.cookie.......
  • Guava工具类中一些集合和方法的使用
    Multiset:无序可重复set,重复元素显示个数还是挺有用的数据结构@Testvoidtest5(){Strings="goodgoodstudydaydayup";String[]s1......
  • Web前端CSS清除浮动的5种方法
     在移动端清除浮动布局,常用的5种方法:使用清除浮动的类;使用overflow属性;使用 flex 布局;使用grid 布局;使用 table 布局。根据实际情况选择适合的方法,需要注......