本篇文章小编给大家分享一下SpringMVC拦截器使用代码方法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
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(){}
请响应前处理的逻辑 - 后置。
方法返回值:无返回值。
目录:
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"); } }
测试:
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整