拦截器HandlerInterceptorAdapter使用方法

2023-11-08

一、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类

@Component
public class AuthorityInterceptor extends HandlerInterceptorAdapter {
    private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("进入到拦截器中:preHandle() 方法");
        System.out.println(request.getServletPath());
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("进入到拦截器中:postHandle() 方法中");
        System.out.println(request.getRequestURI());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("进入到拦截器中:afterCompletion() 方法中");
        System.out.println(request.getServletPath());
    }
}

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.实现结果

发送请求

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拦截器HandlerInterceptorAdapter使用方法 的相关文章

  • 在 NodeJs 中使用 Jest 模拟 Http Post 请求

    我有一个使用本机 https request 使用 Azure Function 内的 Node Js 构建的外部 POST API 一切正常 现在我正在尝试构建单元测试用例 并对模拟 Request 方法感到震惊 回调响应具有 on 功能
  • Karma Webpack - 错误:找不到模块“./test/utilities.js”

    我正在使用 Karma Webpack 进行项目的单元测试 当我跑步时karma start 我有这个错误 Error Cannot find module test utilities js at myproject test campa
  • 将 Babel 与单个输出文件和 ES6 模块一起使用

    这是我的 gulp 任务 将 ES6 代码编译成单个 ES5 文件 我使用类和模块 import export 在 ES6 中 gulp src paths scripts pipe sourcemaps init pipe babel p
  • JSON 解析错误 - JSON 中位置 1 处出现意外标记 o

    我需要获取一个 JSON 对象并记录标题控制台以实现自动完成功能 我的 json 的示例如下 title Example 1 url http www example1 com title Example 2 url http www ex
  • 递归process.nextTick警告

    作为我的应用程序的一部分 我有以下代码行 process nextTick function pre populate cache with all users console log scanning users table in ord
  • 使用 javascript 和 jQuery UI datepicker 获取工作日数

    我有两个日期选择器 我可以从中计算天数 而无需计算星期六和星期日 但我想在周五和周六这样做 我尝试过一些不同的方法但失败了 对我来说 处理不包括周六和周日的天数很容易 但处理周五和周六的天数则不然 以下是我的 javascript 代码 f
  • 我们可以为 border-bottom 属性设置渐变颜色吗? [复制]

    这个问题在这里已经有答案了 我们可以添加渐变颜色吗border bottomhtml块元素的属性 边框应该与此类似 谁能告诉我这在 CSS3 中是可能的吗 我像这样尝试过 但无法让它工作 border gradient border bot
  • JavaScript - babel-preset-env 不为 IE11 转换箭头函数

    我很难尝试配置 Babel 来转译 IE11 可以理解的代码 特别是箭头函数 跑步npx webpack mode development使用我的配置不会转换我的代码中的箭头函数 在eval 在生成的代码中的语句中 我可以看到所有实例都未转
  • td 内的文本可以随 td 一起调整大小吗? (是其高度的百分比?)

    我有一个 100 占屏幕的表格 里面有 3x3 9 个单元格 每个单元格占 33 到目前为止 一切都很好 这是一个干净 可扩展的井字棋游戏 问题在于 TD 内的文本不会随比例缩放 有没有办法说 我希望文本大小为 TD 高度的 30 或者其他
  • 纯 JavaScript 工具提示

    我正在尝试用纯 JavaScript 制作一个工具提示 显示在hover 就像 Stack Overflow 中将鼠标悬停在个人资料名称 a 上一样div显示 我尝试使用onmouseover onmouseout并添加了setTimeou
  • jQuery 分钟和秒倒计时器

    我想创建一个 jquery 倒计时器 我尝试了以下代码 但它不起作用 我该怎么办 DEMO https jsfiddle net tbosn210 https jsfiddle net tbosn210 var interval setIn
  • 如何在从数据库异步加载中用占位符替换不存在的图像

    我有一个包含图像的数据库 我需要根据用户的请求即时加载这些图像 这些图像将作为包含 div 容器中的单独 s 的背景图像 类似于图像滚动条 该数据库当前是本地数据库 但这不是我的问题 问题是数据库可能没有我请求的所有图像 并且我可能会得到一
  • 在移动 Safari 上自动播放音频

    在我被火烧死之前 我知道这目前不起作用 因为苹果担心自动下载音频文件 然而 我的问题是 有人找到了狡猾的解决方法吗 我只想在游戏启动时播放启动声音 目前必须等待用户单击某处才能播放音频 你们中的一个聪明人现在一定已经成功了吗 没有机会在移动
  • 未捕获的类型错误:无法分配给只读属性

    我正在尝试 Nicholas Zakas 所著的 Professional JavaScript for Web Developers 一书中的这个非常简单的示例 但我不知道我在这里做错了什么 我错过了一些非常简单的事情 但我被困住了 这是
  • 将 html

    我有一些服务器端代码当前支持 http 字节范围请求 没有任何问题 但是 我希望能够在将转码后的块发送到客户端之前使用 ffmpeg 即时转码视频文件 位于磁盘上 但 ffmpeg 要求我在获取字节时给它一个寻道时间范围来自客户 给定客户端
  • 如何捕获 google 地图的无效 API 密钥

    我有这个代码 如果密钥无效 则会弹出警报 但我想在这种情况下执行一些操作 但我不知道如何连接它 有任何想法吗 Google 不提供检查 Google 地图 API 密钥的外部方法 因此 您无法使用例如查询某些服务 此代码有效吗abcde12
  • jQuery:array[i].children() 不是函数

    以下代码的灵感来自http ignorethecode net blog 2010 04 20 footnotes http ignorethecode net blog 2010 04 20 footnotes 当您将光标移到脚注符号上时
  • 离子选择:预选值在单击一次之前是不可见的

    我刚刚在 ionic 版本 6 中创建了一个 ion select 我的问题是 我在页面加载时已成功预选了一个值 但此预选值未显示在 UI 中 它只是在我单击选择之后出现 但在它没有出现之前 如图 2 所示 我在 ionViewWillEn
  • JQuery 循环遍历动态元素并获取数据值

    我正在尝试使用可折叠面板来完成我的要求 sport on click function var thisId this attr id var thisChildren this sportlist thisChildren each fu
  • 将画布下载为 PNG 图像[重复]

    这个问题在这里已经有答案了 当我尝试将画布下载为 PNG 图像时 浏览器会在新页面中打开该图像 但不下载它 我的下载代码 btnScaricaEtichetta click function console log Download loc

随机推荐

  • 【CTF】AWDP总结(Web)

    目录 CTF AWDP总结 Web 什么是adwp 六种状态 防御 赛前准备 第一时间上waf 注意文件上传的路径 patch包 攻击 CTF AWDP总结 Web 什么是adwp AWDP是一种综合考核参赛团队攻击 防御技术能力 即时策略
  • sudo rosdep init ERROR: cannot download default sources list from:解决办法

    sudo rosdep init ERROR cannot download default sources list from 解决方法 进入 etc hosts文件目录 2 进入到hosts 文件 root ros vm2 etc ge
  • 为一个团队的架构师,怎么提高团队的工作效率

    为一个团队的架构师 怎么提高团队的工作效率 问题1 前端代码开发慢 新人不懂前端知识怎么处理 制定前端常用功能的学习视频 案例文档 将大家经常遇到的问题或者表单 放到案例文档中 目的 方便去查找前端问题的解决方案 规范 写成markdown
  • libcurl使用注意

    libcurl使用注意 注意点1 现象 http短连接超过一定次数后一直返回错误7 即CURLE COULDNT CONNECT 过程有打印 Immediate connect fail for 114 116 228 34 Too man
  • rosserial_arduino 中文教程1:Arduino IDE设置

    rosserial arduino 中文教程 专栏 原文 http wiki ros org rosserial arduino Tutorials 说明 本教程逐步介绍如何设置Arduino IDE以使用rosserial 教程级别 BE
  • 用【花生壳】穿透内网主机运用dai搭建校园实现访问外网访问只有学校内网的教务系统

    小记 上次写CSDN还是去年7月份Steam被盗的时候 一晃1年的时间已经过去了 时间过的好快 这次折腾了一天半 写个CSDN记录一下 也算是一个分享 希望能帮得上有需要的朋友 本人学生一枚 现在正是各个学校期末考试出成绩的日子 Sadly
  • VulnHub-PWNOS: 2.0 (PRE-RELEASE)手动复现msf POC

    以下操作均在测试环境进行 遵纪守法 维护网络安全 此靶场可以直接使用msf getshell 这次我们尝试在不适用msf的情况下 通过分析msf用的poc 模拟我们拿到一个漏洞的poc 如何仿照利用 进行get shell 并root 靶场
  • 2021-07-17王汕7.18下周投资资讯7.19黄金原油周一价格涨跌分析及独家解套策

    期货原油下周行情分析 原油消息面解析 周五 7月16日 美原油小幅走高 油价周四下跌超1 人们预期将有更多原油进入市场 此前有消息称主要石油输出国组织 OPEC 产油国达成妥协 且美国燃料需求周度数据意外糟糕 美国上周原油库存大幅减少几乎没
  • GitHub如何发布自己的网站(详细教学)

    什么是GitHub GitHub是目前使用最多的社交代码托管平台 这是一个你可以玩和实验的地方 在这里你可以找到最令人难以置信的开源信息 新兴技术 特性和设计 这是一个学习新事物和参与的地方 任务一 那么如何通过GitHub发布网站呢 首先
  • 获取当前时间近8个季度

    import java util Calendar import java util Date public class DateTest public static void main String args Date now new D
  • 深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

    系列文章目录 C 高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 LSP 里氏替换原则 系列文章目录 1 里氏替换原则的定义和解读 2 里氏替换原则可以用于哪些设计模式中 3 如何使用里氏替换原则来
  • Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲 Effective C More Effective C Effective STL 这三本书出版已很多年 后来又出版了Effective Modern C More Effective
  • main.exe flag redefined:graceful

    goroutine 1 running flag FlagSet Var 0xc042032120 0xcd0960 0xd33499 0xa07f57 0x8 0xa1959f 0x21 D ITsoftware golang go sr
  • OpenSSL SSL_read: Connection was reset, errno 10054的解决方法

    前言 起因 执行git push 的时候遇到了 OpenSSL SSL read Connection was reset errno 10054 的错误提示 经过 这是服务器的SSL证书没有经过第三方机构的签署 所以报错 错误原因可能是网
  • struts2 下载文件报 “java.lang.IllegalStateException”异常

    有关struts2下载组件的具体介绍我就在此略过了 看此文的同志想必大多是碰到这样让人很是不爽的问题 下面就将该问题的最终解决办法介绍如下 问题概要 在struts2中使用result里type stream 的结果类型时 可以实现文件的下
  • 那些开发过程中需要遵守的开发规范

    入职公司三天 没干啥其他活 基本在配置本地环境和阅读相关文档 技术方面公司基本用的是主流的技术体系 入职后需要先阅读阿里的开发规范和其他的一些产研文档 今天整理一些平时需要关注的阿里规约和数据库开发规范 方便今后在开发过程中查阅 文章目录
  • js game (.^-^.)

    try 新手 可能会有点小问题 欢迎指出 var lc 10 var cl 12 var e 0 v new Array for var i 0 i lt 25 i var a Math random cl 1 lc lc点 a a 100
  • 创建Umi项目

    关于Umi的网站 点开百度搜索umi 注意 浏览器直接搜索和百度搜索打开的官网是有区别的 百度会优先打开国内的网站 准备工作 首先得有node 版本要在14以上 后面是用yarn安装 所以没有yarn包管理器 安装下载一个 1 全局安装ya
  • hbuilder开发uniapp配置安卓模拟器

    安卓模拟器使用的是蓝蝶模拟器 配置如下 然后打开蓝蝶模拟器软件 点击设置 点击引擎设置 勾选允许AADB连接 各个模拟器端口配置 模拟器名称 连接默认端口 夜神安卓模拟器夜神安卓模拟器 62001 逍遥安卓模拟器逍遥安卓模拟器 21503
  • 拦截器HandlerInterceptorAdapter使用方法

    一 Interceptor定义 拦截器是在面向切面编程中应用的 就是在你的service或者一个方法前调用一个方法 或者在方法后调用一个方法 是基于JAVA的反射机制 1 拦截器 Interceptor 执行顺序 1 请求到达 Dispat