首页 > 其他分享 >拦截器的简单使用

拦截器的简单使用

时间:2022-10-18 00:23:42浏览次数:99  
标签:拦截器 preHandle 简单 request 使用 执行 public HandlerInterceptor

概念

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

拦截器使用步骤

创建一个实现了HandlerInterceptor的类

拦截器它是链式调用,一个应用中可以同时存在多个拦截器Interceptor, 一个请求也可以触发多个拦截器 ,而每个拦截器的调用会依据它的声明顺序依次执行。首先编写一个简单的拦截器处理类,请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法。

  • preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。

  • postHandle():只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。

  • afterCompletion():只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    </span><span style="color: #0000ff;">return</span> HandlerInterceptor.<span style="color: #0000ff;">super</span><span style="color: #000000;">.preHandle(request, response, handler);
}

@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {


HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

 

在Web配置类中添加拦截器(使拦截器生效)

将自定义好的拦截器处理类进行注册,并通过addPathPatterns、excludePathPatterns等属性设置需要拦截或需要排除的 URL。

@Configuration
public class MvcConfig implements WebMvcConfigurer {
​
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 登录拦截器(此处设置需要排除的 URL)
        registry.addInterceptor(new LoginInterceptor())
                .excludePathPatterns(
                        "/shop/**",
                        "/voucher/**",
                        "/shop-type/**",
                        "/upload/**",
                        "/blog/hot",
                        "/user/code",
                        "/user/login"
                ).order(1);
    }
}

 

拦截器执行顺序

preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1

 

控制执行顺序方式不同

实际开发过程中,会出现多个过滤器或拦截器同时存在的情况,不过,有时我们希望某个拦截器能优先执行,就涉及到它们的执行顺序。

拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").order(1);
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(3);
    }

 

转载至:

Java过滤器与拦截器的区别(一文搞懂) ——好文章好文章好文章强烈推荐!!!

https://blog.csdn.net/qq_40107474/article/details/125424542?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166599505216782425193319%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166599505216782425193319&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~pc_rank_34-16-125424542-null-null.142^v58^js_top,201^v3^control_1&utm_term=java%E5%AE%9E%E7%8E%B0%E6%8B%A6%E6%88%AA%E5%99%A8&spm=1018.2226.3001.4187

 

 

标签:拦截器,preHandle,简单,request,使用,执行,public,HandlerInterceptor
From: https://www.cnblogs.com/galo/p/16801196.html

相关文章

  • Stream流简单使用
    创建流/***创建流*/@TestpublicvoidtestOne(){List<Author>authorList=newArrayList<>();authorList.add(Author.buil......
  • 【汇编】最简单的汇编程序:实现清屏(.asm源码)
    项目环境编译环境:搭建一个nasm2.8的编译环境。镜像文件:采用winhex_18.2刷入编码。虚拟机:采用Bochs-2.4.5。项目软件傻瓜式环境配置。解压文件到D盘能直接使用。程序介绍汇编......
  • 【汇编】封装实现界面绘制,一个简单的记事本(.asm源码)
    项目环境编译环境:搭建一个nasm2.8的编译环境。镜像文件:采用winhex_18.2刷入编码。虚拟机:采用Bochs-2.4.5。项目软件傻瓜式环境配置。解压文件到D盘能直接使用。运行结果程序......
  • dremio HomeFileSystemStoragePlugin简单介绍
    使用过dremio的同学应该了解dremio对于每个用户会支持一个@的导航(小房子标记)参考接口效果restapi请求的,会包含一个containerTypehome的就是HomeFileSystemStorage......
  • Eclipse使用技巧
    介绍各位使用Eclipse作为开发IDE的看客们,Eclipse的一些使用技巧您都知道吗?本文会介绍一些很实用的快捷键。快捷键Ctrl+Shift+L弹出快捷键说明进入或退出块选择模式Alt+Sh......
  • 使用PDF Arrange移除PDF文件的“安全模式”
    以前就写过一篇博客《​​使用pdfsam来移除PDF文件的安全模式​​》,在这篇文章中是使用pdfsam来对PDF文件进行某种程度的“破坏”,然后“重建”另一个PDF文件,从而达到移除“......
  • Eclipse中Tomcat插件的使用说明
    打开Tomcat视图通过菜单Window->ShowView->Other然后输入过滤项Servers,选择找到的内容然后点OK即可。添加web项目如果在打开的Tomcat视图中已经有一个实例,则右键菜单Addan......
  • python爬虫从0到1 -Requests库的基本使用(get/post请求)
    文章目录​​前言​​​​(一)requests的get请求​​​​1.导入requests库​​​​2.定义url地址以及请求头​​​​3.返回响应数据​​​​4.将数据打印​​​​总结(对比......
  • 软件测试很简单么?
    有个不是很好笑的笑话,说的是某某公司扫地的大妈都可以做软件测试,某某公司看门的大爷都可以做软件测试。导致现在还有很多人对测试的认知都停留在这个层面上。想当初,个人也......
  • 《Rust唠嗑室》第36期 - 分享使用Rust进行嵌入式开发创业的一些点滴
    题目:分享使用Rust进行嵌入式开发创业的一些点滴主讲人:cz内容: 一.创业项目为什么选择Rust进行嵌入式开发(ForSTM32)?二.根据项目选用哪些Rustcrates? 三.Rust在嵌入......