Interceptor的基本介绍和使用preHandle、postHandle与afterCompletion

article/2025/10/12 12:49:28

目录

  • preHandle
  • postHandle
  • afterCompletion
  • 项目测试代码
  • 项目测试

preHandle

调用时间:Controller方法处理之前

执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行

若返回false,则中断执行,注意:不会进入afterCompletion

顾名思义,该方法将在请求处理之前进行调用。SpringMVC中的Interceptor是链式的调用的,在一个应用中或者是在一个请求中可以同时存在多个Interceptor。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true 时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller 方法。

postHandle

调用前提:preHandle返回true

调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作

执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。

备注:postHandle虽然post打头,但post、get方法都能处理

由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion和postHandle方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。postHandle方法,顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行。

afterCompletion

调用前提:preHandle返回true

调用时间:DispatcherServlet进行视图的渲染之后

多用于清理资源

该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

项目测试代码

TokenInterceptor.class

package com.orm.mybatis.token.interceptor;import com.alibaba.fastjson.JSON;
import com.orm.mybatis.token.annotation.PassToken;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashMap;/*** 添加拦截器*/
@Component
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");//如果不是映射到方法直接放行if(!(handler instanceof HandlerMethod)){return true;}HandlerMethod handlerMethod = (HandlerMethod)handler;Method method = handlerMethod.getMethod();if (method.isAnnotationPresent(PassToken.class)) { //方法上面是否有注解?PassToken passToken = method.getAnnotation(PassToken.class);if (passToken.value()){return true;}else {HashMap<String,String> hashMap = new HashMap<String,String>();hashMap.put("passTokenFalse","passTokenFalse");String resultJson = JSON.toJSONString(hashMap);response.setContentType("application/json;charset=utf-8");response.getWriter().print(resultJson);return false;}}HashMap<String,String> hashMap = new HashMap<String,String>();hashMap.put("noPass","noPass");String resultJson = JSON.toJSONString(hashMap);response.setContentType("application/json;charset=utf-8");response.getWriter().print(resultJson);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

PassToken.class

package com.orm.mybatis.token.annotation;import java.lang.annotation.*;@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {boolean value() default true;
}

TestLoginController.class

package com.orm.mybatis.token.controller;import com.orm.mybatis.token.annotation.PassToken;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;@RestController
public class TestLoginController {@GetMapping("/test/one")public HashMap<String,String> login(){HashMap<String,String> hashMap = new HashMap<>();hashMap.put("one","one");return hashMap;}@PassToken@GetMapping("/test/two")public HashMap<String,String> login1(){HashMap<String,String> hashMap = new HashMap<>();hashMap.put("two","two");return hashMap;}@PassToken(value = false)@GetMapping("/test/three")public HashMap<String,String> login2(){HashMap<String,String> hashMap = new HashMap<>();hashMap.put("three","three");return hashMap;}
}

项目测试

http://127.0.0.1:8080/test/one
在这里插入图片描述
后台反馈
在这里插入图片描述
结果:由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion和postHandle方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。所以没有调用。


http://127.0.0.1:8080/test/two
在这里插入图片描述
后台反馈
在这里插入图片描述
结果:由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion和postHandle方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。所以调用了。


http://127.0.0.1:8080/test/three

在这里插入图片描述
在这里插入图片描述
结果:由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion和postHandle方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。没有调用。因为@PassToken(value = false),后台判断了value为false的话return false


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

相关文章

preHandle执行多次问题

首先说下我的问题吧&#xff0c;我是swagger测试多个接口&#xff0c;其他接口没有啥问题&#xff0c;但是就是查询第三方系统的接口一直请求多次&#xff0c;最后debug看了下第二次的请求路径&#xff0c;卧槽&#xff0c;这个不是别的系统的路径吗&#xff0c;瞬间明白了。 …

java 中prehandle,Spring MVC中拦截器HandlerInterceptorAdapter中的preHandle方法

拦截器&#xff1a;顾名思义&#xff0c;就是对请求进行拦截&#xff0c;做一些预处理、后处理或返回处理的操作 Spring MVC中使用拦截器的方法&#xff0c;继承HandlerInterceptorAdapter类&#xff0c;并根据需求实现其中的preHandle方法(预处理)、postHandle方法(返回处理)&…

HandlerInterceptor的preHandle、postHandle、afterCompletion方法的作用

public class MyHandlerInterceptor implements HandlerInterceptor { &#xff08;1&#xff09; preHandle方法是进行处理器拦截用的&#xff0c;顾名思义&#xff0c;该方法将在Controller处理之前进行调用。 SpringMVC中的Interceptor拦截器是链式的&#xff0c;可以同时…

SpringBoot——拦截器

符合条件的请求被放行&#xff0c;不符合条件的请求访问不到所请求的东西。 1、步骤 &#xff08;以登陆拦截器为例&#xff0c;只有用户登录了才能访问某页面&#xff09;&#xff1a; 1、编写拦截器&#xff0c;实现HandlerInterc此接口有三个方法 &#xff0c; preHandle…

拦截器的配置

文章目录 拦截器简介实现一个拦截器拦截器的配置多个拦截器时的执行顺序 拦截器简介 过滤器可以拦截请求&#xff0c;拦截器也能拦截请求&#xff0c;那过滤器和拦截器有啥区别&#xff1f;看下面这张图就明白了。 拦截器有三个方法&#xff0c;分别是 preHandle&#xff0c…

springmvc拦截器

实现拦截器步骤 步骤一 声明拦截器类&#xff08;实现 handlerInterceptor接口&#xff09; 1.主要看prehandle方法的返回值确定是否放行&#xff0c;如果是true&#xff0c;表示放行&#xff0c;会执行该拦截器的prehandle方法&#xff0c; 如果有多个拦截器&#xff0c;…

DateUtils时间类

1、测试 package test.utils.date; import java.text.ParseException; import java.util.Date; import org.apache.commons.lang.time.DateUtils; public class Test {public static void main(String[] args) {int amount 2;Date date new Date();// System.out.printf(&qu…

dateutil模块

安装&#xff1a;终端运行 pip install python-dateutil python第三方模块dateutil模块主要使用以下&#xff0c;1&#xff0c; parse&#xff0c;2&#xff0c;rrule, 3&#xff0c;relativedelta。 parse把字符串格式的时间转化为datetime.datetime格式时间。util是计算时间差…

封装工具类DBUtils、DateUtils详解

三、封装工具类DBUtils、DateUtils 把以下会重复写的代码封装&#xff1a; 3.1 封装货期连接、释放资源两个方法 提供public static Connection getConnection(){}方法。提供public static void closeAll(Connection conn,Statement sm,ResultSet rs){}方法。 3.2 跨平台方…

常用DateUtil

导语 最近项目中用到一些时间的操作&#xff0c;当然我们可以选择lang3&#xff0c;或者其他三方的jar&#xff0c;来进行操作&#xff0c;小编将项目中用到的一些用于的时间工具整理了一下&#xff0c;给大家参考一下! 先给大家展示一下使用及效果 使用 GetMapping(value &…

Android个人学习笔记之实战时间的获取相关-DateUtils

前言&#xff1a;在近期的项目编写过程中&#xff0c;看到了时间工具类DateUtil&#xff0c;虽然大致的用法已经清楚&#xff0c;但是对于这个类还是有一定的不解&#xff0c;很多类型并不知道实际的效果如何&#xff0c;所以就结合Android的API&#xff0c;实战来测试不同的效…

什么是token和使用的意义

一、什么是token token &#xff08;计算机术语&#xff09; 在计算机身份认证中是令牌&#xff08;临时&#xff09;的意思&#xff0c;在词法分析中是标记的意思。一般作为邀请、登录系统使用。 二、token的意义 令牌&#xff1a;代表执行某些操作的权利和对象&#xff0c;访…

Token

Token笔记 是什么SessionCookietoken 为什么Session和Cookie 区别&#xff1a;token和Session区别&#xff1a;Session缺陷token相比而言&#xff1a; 怎么做token工作流程&#xff1a;token结构&#xff1a; 是什么 web应用程序是使用HTTP协议来传送数据的。而HTTP是无状态的…

Java 中 Token 是什么,有哪些用途

简介 Token 是一种身份验证机制&#xff0c;通常由服务器生成并返回给客户端&#xff0c;客户端在后续的请求中携带 Token&#xff0c;以证明自己的身份。在 Java 中&#xff0c;Token 的应用场景非常广泛&#xff0c;例如用户登录、API 认证、OAuth 授权等等。 在用户登录的…

Token的作用及原理

讲到Token的作用和原理&#xff0c;网上有很多相关的技术文章&#xff0c;通过搜集整理并加入自己的理解体会&#xff0c;做一个总结整理&#xff0c;希望可以帮助到更多有需要的人。 1、token作用及原理 Token&#xff0c;即令牌&#xff0c;是服务器产生的&#xff0c;具有…

Token和Jwt的区别

Token基本原理 Token(就是加密的字符串,使用MD5,等不可逆加密算法,一定要保证唯一性) 客户端使用用户名跟密码请求登录 服务端收到请求&#xff0c;去验证用户名与密码 验证成功&#xff0c;服务端会签发一个Token保存到(Session,redis,mysql…)中&#xff0c;然后再把这个 …

什么是token及怎样生成token

什么是token Token是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便将此Token返回给客户端&#xff0c;以后客户端只需带上这个Token前来请求数据即可&#xff0c;无需再次带上用户名和密码。 基…

token是什么?

token的意思是令牌&#xff0c;是服务端生成的一串字符串&#xff0c;作为客户端进行请求的一个标识。 当用户第一次登录后&#xff0c;服务器生成一个token&#xff0c;并将token返回给客户端&#xff0c;之后客户端只需要带上这个token前来请求数据即可&#xff0c;无需再带…

Token是什么 Token登录认证

Token 是在服务端产生的一串字符串。如果前端使用用户名/密码向服务端请求认证&#xff0c;服务端认证成功&#xff0c;那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化&#xff08;比如存入数据库&a…

什么是Token(令牌)

Acess Token 访问资源接口&#xff08;API&#xff09;时所需要的资源凭证 简单token 的组成&#xff1a; uid&#xff08;用户唯一的身份标识&#xff09; 、time (当前时间的时间戳) ,sign&#xff08;签名&#xff0c;token的前几位以hash算法压缩成的一定长度的16进制字符…