当前位置: 首页 > ds >正文

springmvc-拦截器

目录

一,拦截器的职责

二,拦截器的应用场景

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

四,使用拦截器

一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

二 ,编写拦截器配置类用于配置拦截器的执行位置。

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

preHandle方法返回值:false 拦截,不进行到下一步


一,拦截器的职责

  • 拦截,访问controller控制层的映射路径

二,拦截器的应用场景

  • 权限验证:
  • 当你浏览某一界面,想要点击去看,发现 你没有登录,就会跳转到登录界面

三,拦截器的工作原理

拦截器在Spring MVC请求处理流程中的位置:

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端

四,使用拦截器

准备工作:添加web起步依赖


一 ,编写拦截类,实现HandlerInterceptor接口,重写方法

作用:制定拦截规则,当拦截到指定的映射路径

重写三个方法【preHandle、postHandle、afterCompletion】)。该类要交给spring容器管理(把注解@Component写在类上)

package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {//  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
//     postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}

二 ,编写拦截器配置类用于配置拦截器的执行位置。

作用:将自定义拦截类注册和添加拦截路径

该类继承WebMvcConfigurationSupport类,重写addInterceptors方法,在此方法的实现中添加拦截路径)

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**,给静态资源放行/static/** registry.addInterceptor(userInterpector).addPathPatterns("/user/**").excludePathPatterns("/static/**");}
}

三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

springmvc配置类

package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {}

五 案例(验证  preHandle方法返回值不同对被访问方法产生的影响)

preHandle方法返回值:true 放行

按照以下顺序,执行

客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端


案例

自定义拦截类代码:

package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {//  preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
//     afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
//     postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}

拦截配置类

package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**registry.addInterceptor(userInterpector).addPathPatterns("/user/**");}
}

springmvc加载 拦截配置类和扫描拦截类所在的包

package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig  {}

controller类被访问的方法

package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class userController {@RequestMapping("/login")public String login(){System.out.println("rwrwr");System.out.println("login11111111111111");return "ok";}
}

测试

比较:【客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端】


preHandle方法返回值:false 拦截,不进行到下一步

测试

http://www.xdnf.cn/news/1979.html

相关文章:

  • 语音合成之六端到端TTS模型的演进
  • 【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读
  • isEmpty和isBlank的底层原理和区别
  • 79. 单词搜索
  • 深入理解Java的 JIT(即时编译器)
  • 从桥梁坍塌到地质隐患:超导磁测量技术的“防患未然”价值
  • pyinstaller打包paddleocr发生错误解决
  • C++中随机数的产生
  • 【HFP】蓝牙HFP协议中音频连接转移与拨号功能的深度解析
  • Java使用IText7动态生成带审批文本框的PDF文档
  • 【服务器操作指南】从 Hugging Face 上下载文件 | 从某一个网址上下载文件到 Linux 服务器的指定目录
  • 用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践
  • 692. 前K个高频单词(map的练习)
  • 【初识Trae】字节跳动推出的下一代AI原生IDE,重新定义智能编程
  • 11.ArkUI Tabs的介绍和使用
  • 【多目标进化算法】 MOEA/D算法(知识点)
  • RAG5个常见错误
  • 硬件虚拟化(如KVM、VMware)
  • Redis相关
  • PHP:点击/拖动-上传图片文件目录,并存入数据库
  • 大肠杆菌诱导蛋白时OD600=0.6-0.8添加IPTG的思考-实验操作系列-009
  • 0. Selenium工具的安装
  • 【Linux网络】TCP服务中IOService应用与实现
  • 一个非常快速的 Latex 入门教程【Part 2】
  • 2025产品经理AI效率指南:3大案例实战流程图、原型图与PRD文档
  • AI 场景落地:API 接口服务 VS 本地部署,哪种更适合?
  • 不在同一个局域网的远程桌面连接怎么设置?本地内网计算机让其他网络远程访问6种常用方法
  • 计算机界的50位大牛(23)—— 詹姆斯·尼古拉·格雷:数据库事务的缔造者
  • 客户联络中心能力与客户匹配方式
  • [论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models