springmvc拦截器

article/2025/10/12 12:43:16

实现拦截器步骤

步骤一   声明拦截器类(实现 handlerInterceptor接口)

1.主要看prehandle方法的返回值确定是否放行,如果是true,表示放行,会执行该拦截器的prehandle方法,

如果有多个拦截器,且全部放行  则preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

2.如果是false表示不放行。只执行该拦截器的prehandle方法

    如果有多个拦截器,某一个不放行则所有拦截器的posthandle一个都不执行,aftercomplitiation倒序执行

   举例:有四个拦截器 ,第三个拦截之后没有放行, 就是执行第一个拦截器的prehandle,第二个拦截器的prehandle,第三个拦截器的prehandle, 第二个拦截器的afterCompletion  第一个拦截器的afterCompletion      所有的postHandle方法都不执行

package com.testfilter;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AInterceptor  implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("prehandle方法执行了");return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle方法执行了");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion方法执行了");}
}

 步骤二  在springmvc.xml中配置

mvc:exclude-mapping设置不拦截的路径

如果访问不拦截的路径,则不会执行拦截器的任何一个方法

 注意:拦截器中的路径 ,/**代表拦截所有路径,/*代表只是一层目录

    /*  可以拦截

      /* 不能拦截 

    <mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/index" /><bean class="com.testfilter.AInterceptor"></bean></mvc:interceptor></mvc:interceptors>

二.拦截后跳转至指定页面

比如拦截所有不是login的请求,并且查看session中是否有用户信息,没有就跳转到登录界面,有就放行,

注意:跳转一定要跳转至不被拦截的请求路径上,否则会一直循环下去 :

-请求被拦截  ----重定向或者请求转发至页面 -----重定向请求或请求转发请求被拦截--请求被拦截

而且返回值一定是false,如果是true,请求转发或重定向一个页面,拦截器放行一个页面,服务器会不知道该显示哪个页面

package com.example.springbootdemo3.testfilter;import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;//1.设置拦截器实现handlerinterceptor接口,写拦截方法
public class firstInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("进入了拦截器");HttpSession session = request.getSession();if (session.getAttribute("user") == null) {System.out.println("拦截器跳转了");response.sendRedirect("index");}return false;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {System.out.println("posthandel执行了");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {System.out.println("afterhandle执行了");}
}

2、拦截器的三个抽象方法

SpringMVC中的拦截器有三个抽象方法:

preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法

postHandle:控制器方法执行之后执行postHandle()

afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

3、多个拦截器的执行顺序

a>若每个拦截器的preHandle()都返回true

此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:

在前面的会先执行

assecondinterceptor先于后面的bfirstINterceptor

 <mvc:interceptor><mvc:mapping path="/**"/><bean class="com.testfilter.AsecondInterceptor"></bean><!--            <mvc:exclude-mapping path="/testRequestEntity"/>--></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.testfilter.BfirstInterceptor"></bean>

preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

为什么posthandle 和aftercomplation会返序执行呢(如下图)?观察源码

4.错误页面 

当拦截器不拦截时(prehandel返回值为true),如果请求发生了错误,则会通过两次拦截器。

因为顺序是这样的:

请求到达拦截器 --拦截器放行--页面发生错误

--请求转发错误的提示页面--拦截器放行

就是显示错误页面的请求会被拦截一次。未避免这种情况, 可以设置不拦截  /error请求

<mvc:exclude-mapping path="/error"/>

错误的提示页面指的是 

 

观察源码:

在控制方法中打断点 可以发现下面方法栈中有disparctureservlet,证明disparctureserlvet是先于return 这句执行的,或者说由disparctureservlet控制这个return返回(是不是不对啊?要问问)

在dispratctureservlet 的 mav 方法前是 prehandle方法 之后是posthandle 在之后渲染视图时执行 aftercomplitation 在这几个方法分别打断点

 鼠标移动到prehandle 的 mappedHandler

进入这个方法

这个方法遍历了三个拦截器,如果拦截器都不进行拦截(即所有prehandle方法中返回值都为true),则什么都不做,最后返回true 。 interceptorindex就是 最后一个拦截器的编号 (编号从0开始) 。

继续f8 在执行完mv= 之后 进入posthandle方法,发现这里是将interceptorList 倒过来,减减遍历

继续f8 进入aftercomapplication方法,发现这里也是将interceptorList 倒过来,减减遍历

所以 prehandle方法 posthandle方法是倒序调用的

b>若某个拦截器的preHandle()返回了false

如果有拦截器进行了拦截,则立刻返回false,并且interceptorIndex为 上一个拦截器对应的编号。

再看源码可以发现,posthandle一个都不执行,aftercomplitiation倒序执行

总结:有四个拦截器 ,第三个拦截之后没有放行, 就是执行第一个拦截器的prehandle,第二个拦截器的prehandle,第三个拦截器的prehandle, 

 第二个拦截器的afterCompletion         第一个拦截器的afterCompletion

所有的postHandle方法都不执行


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

相关文章

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进制字符…

什么是token?token是用来干嘛的?

相信很多从事计算机行业的朋友都听说过token这么个东西&#xff0c;但是其他行业的人就很少了解到token&#xff0c;下面就给大家来详细介绍一下token是什么意思&#xff1f;token是用来干嘛的这一块的内容&#xff0c;希望能帮助到大家。 &#x1f3fb; token是什么意思 作为…

究竟什么是token??

基于服务器验证方式的验证流程&#xff1a; 我们都是知道HTTP协议是无状态的&#xff0c;这种无状态意味着程序需要验证每一次请求&#xff0c;从而辨别客户端的身份。在这之前&#xff0c;程序都是通过在服务端存储的登录信息来辨别请求的。这种方式一般都是通过存储Session来…

python 处理 MovieLens 数据

文章目录 一、总述二、处理流程1. 处理 users 数据2. 处理 movies 数据3. 处理 ratings 数据4. 将 users、movies 和 ratings 数据合并5. one-hot 处理6. 完整代码 一、总述 该文记录处理 MovieLens-1m 数据集的步骤&#xff0c;首先分别处理用户、电影和评分数据&#xff0c;…

电影数据集总结:Netflix、MovieLens、LDOS-CoMoDa、AdomMovie

数据集&#xff1a; 1.Netflix 描述&#xff1a;包含Netflix上48万多个随机选取的匿名用户&#xff0c;对于1万7千多部电影的1兆多个电影评分 时间&#xff1a;1988.10~2005.11 内容&#xff1a; 包括training set&#xff0c;movie titles&#xff0c;probe set&#xff0…

从IMDB上爬取MovieLens数据集中的详细电影信息

文章目录 基于协同过滤的电影推荐系统数据集HTML页面分析爬虫代码运行时间百度网盘链接 基于协同过滤的电影推荐系统 用这个数据集实现了一个小型的电影推荐网站&#xff0c;GitHub代码 数据集 数据集是MovieLens提供的ml-latest-small https://grouplens.org/datasets/mov…

数据分析实例:MovieLens电影数据分析

数据分析实例&#xff1a;MovieLens电影数据分析 数据准备 数据集来源&#xff1a;grouplens.org/datasets/movielens/ 下载 ml-1m.zip&#xff0c;read me 中有电影评分介绍 MovieLens 1M电影分级。 稳定的基准数据集。 6000个用户观看4000部电影时获得100万个评分。 发布2…