简单总结SpringMVC拦截器的使用方法
SpringMVC拦截器
拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务。
过滤器与拦截器本质区别:
(1)拦截器时AOP思想的具体应用(一个横切面,直接切进请求响应中去)。
(2)拦截器时spring MVC特有的。
(3)拦截器只会拦截 访问控制器的方法,如果访问静态资源如:.jsp/html/css/image/js 时,它不会去拦截,而Filter过滤器无论什么都会去拦截。
自定义拦截器需要两步:
第一步:编写自定义类实现 HandlerInterceptor 接口,且必须重写方法;
第二步:在配置类中,注册拦截器,实现 WebMvcConfigurer接口,重写对应的方法;关于配置类 我在这边文章有记录:https://www.jb51.net/article/204128.htm
(1)public boolean preHandle() {}
请求前处理的逻辑 - 前置。
方法返回值:返回布尔值,返回true表示可以执行后续代码,返回false程序会终止。
(2)public void postHandle(){}
请响应前处理的逻辑 - 后置。
方法返回值:无返回值。
目录:
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"); } }
小例子
跟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拦截器内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 任何时候,如果我们想要为请求添加全局功能,例如身份认证、错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段...2016-01-05
springboot配置多数据源后mybatis拦截器失效的解决
这篇文章主要介绍了springboot配置多数据源后mybatis拦截器失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-23使用jQuery.form.js/springmvc框架实现文件上传功能
这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14- 这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-20
SpringMVC中的handlerMappings对象用法
这篇文章主要介绍了SpringMVC中的handlerMappings对象用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-26- 本篇文章是对C#键盘勾子(Hook)拦截器,屏蔽键盘活动进行了详细的分析介绍,需要的朋友参考下...2020-06-25
SpringMVC如何获取表单数据(radio和checkbox)
这篇文章主要介绍了SpringMVC如何获取表单数据(radio和checkbox)的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-06- 本文介绍了使用spring拦截器实现日志管理实例的教程,非常实用,有兴趣的同学可以参考一下本文 使用HandlerInterceptor拦截器,可以拦截请求,实现通用的日志管理操作 一...2017-07-06
SpringBoot之HandlerInterceptor拦截器的使用详解
这篇文章主要介绍了SpringBoot之HandlerInterceptor拦截器的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-26- 今天带大家学习SpringMVC的相关知识,文中对SpringMVC数据输出作了非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下...2021-06-06
- 今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-08-20
- 这篇文章主要给大家介绍了关于SpringMVC处理数据输出的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-02
- 这篇文章主要介绍了使用springmvc临时不使用视图解析器的自动添加前后缀,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29
- 这篇文章主要介绍了springMVC web.xml中的配置加载顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-30
- 大家应该都知道请求重定向和请求转发都是web开发中资源跳转的方式,这篇文章主要给大家介绍了关于Spring MVC重定向与转发的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-09-07
- 这篇文章主要介绍了SpringMVC @RequestBody的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-05
使用Spring的拦截器监测每个Controller或方法的执行时长
这篇文章主要介绍了使用Spring的拦截器监测每个Controller或方法的执行时长,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-28- angularjs作为一个全ajax的框架,对于请求,如果页面上不做任何操作的话,在结果反回来之前,页面是没有任何响应的,不像普通的HTTP请求,会有进度条之类...2015-12-29
- shiro可以直接和spring整合,但是这样需要单独配置spring用于整合shiro,在配置springmvc,接下来通过实例代码给大家介绍shiro 整合 SpringMVC 的方法,感兴趣的朋友一起看看吧...2021-08-14
- Springmvc接受请求参数的几种介绍,如何接受json请求参数,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧...2021-07-24