简单总结SpringMVC拦截器的使用方法


Posted in Java/Android onJune 28, 2021

SpringMVC拦截器

拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务。

过滤器与拦截器本质区别:

(1)拦截器时AOP思想的具体应用(一个横切面,直接切进请求响应中去)。

(2)拦截器时spring MVC特有的。

(3)拦截器只会拦截 访问控制器的方法,如果访问静态资源如:.jsp/html/css/image/js 时,它不会去拦截,而Filter过滤器无论什么都会去拦截。

自定义拦截器需要两步:

第一步:编写自定义类实现 HandlerInterceptor 接口,且必须重写方法;

第二步:在配置类中,注册拦截器,实现 WebMvcConfigurer接口,重写对应的方法;

(1)public boolean preHandle() {}

请求前处理的逻辑 - 前置。
方法返回值:返回布尔值,返回true表示可以执行后续代码,返回false程序会终止。

(2)public void postHandle(){}

请响应前处理的逻辑 - 后置。
方法返回值:无返回值。

目录:

简单总结SpringMVC拦截器的使用方法

package com.lxc.springboot.interceptor;
 
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
 
@Component
public class MyInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        s
        // 拦截前的操作
        System.out.println("-----------前置拦截-----------");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 拦截后的操作
        System.out.println("------------后置拦截------------");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 可以做一些清理工作
    }
}

注册拦截器:

package com.lxc.springboot.config;
 
 
import com.lxc.springboot.intercetor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import javax.annotation.Resource;
 
/**
 * @扩展springMVC
 * 第一步:
 * @Configuration 注解的作用:让这个类变为配置类
 * 第二步:
 * 必须实现 WebMvcConfigurer 接口
 */
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
    @Resource
    private MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addInterceptor():注册拦截器,参数是一个拦截器
        // addPathPatterns(): 路径映射,哪些路径需要被拦截,/** 全部拦截
        // excludePathPatterns(): 排除哪些路径,不会被拦截
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

简单总结SpringMVC拦截器的使用方法

小例子

跟Filter一样,记录接口的请求响应耗时:

package com.lxc.springboot.interceptor;
 
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 这个是拦截器,与过滤器区别:
 *
 * 【【【【特别注意:增加拦截器,还需要在config中增加一个配置类!配置】】】】
 *
 * (1)拦截器是spring特有的,经常用于登录校验、权限验证、请求打印日志等等。
 * (2)拦截器不需要你手动调用后续代码执行,它是有两个方法的,且分开的,一个前,一个后
 * (3)而过滤器,我们会在打印日志的中间,使用filterChain.doFilter()方法去调用后续代码执行的!
 * (4)拦截器的 preHandle 前置处理方法,必须返回true,否则后续逻辑不会执行,整个业务也会结束!
 */
@Component // 增加这个注解,让spring能扫描到这个类
public class LogInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        LOG.info("【全局拦截器】");
        LOG.info("*********** InterceptorLog日志开始 *********** ");
        LOG.info("* 请求地址: {}, 方法: {}", request.getRequestURL().toString(), request.getMethod());
        LOG.info("* 远程地址: {}, 域名: {}, 端口: {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort());
        long startTime = System.currentTimeMillis();
        request.setAttribute("boot-responseTime", startTime);
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // request.getAttribute("boot-responseTime") 返回的是Object
        long startTimed = (long) request.getAttribute("boot-responseTime");
        LOG.info(" *********** InterceptorLog 结束,耗时: {} ms *********** ", System.currentTimeMillis() - startTimed);
    }
}

在配置类中注册拦截器:

package com.lxc.springboot.config;
 
import com.lxc.springboot.intercetor.LogInterceptor;
import com.lxc.springboot.intercetor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import javax.annotation.Resource;
 
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
    @Resource
    private MyInterceptor myInterceptor;
    @Resource
    private LogInterceptor logInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
    
}

测试:

简单总结SpringMVC拦截器的使用方法

到此这篇关于简单总结SpringMVC拦截器的使用方法的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
JUnit5常用注解的使用
Jul 02 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
spring cloud 配置中心native配置方式
Sep 25 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
java多态注意项小结
Oct 16 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
SpringBoot实现异步事件驱动的方法
Jun 28 #Java/Android
Spring整合Mybatis的全过程
Jun 28 #Java/Android
Java中常用解析工具jackson及fastjson的使用
Java中使用Filter过滤器的方法
Jun 28 #Java/Android
浅谈Python魔法方法
Java实现二维数组和稀疏数组之间的转换
深入理解java.lang.String类的不可变性
You might like
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
关于vue面试题汇总
2018/03/20 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python中有趣在__call__函数
2015/06/21 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
考试不及格检讨书
2014/01/09 职场文书
感恩节活动方案
2014/01/27 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
青安岗事迹材料
2014/05/14 职场文书
元旦主持词开场白
2015/05/29 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL