经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
简单总结SpringMVC拦截器的使用方法
来源:jb51  时间:2021/6/28 12:41:39  对本文有异议

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(){}

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

目录:

  1. package com.lxc.springboot.interceptor;
  2. import org.springframework.stereotype.Component;
  3. import org.springframework.web.servlet.HandlerInterceptor;
  4. @Component
  5. public class MyInterceptor implements HandlerInterceptor {
  6. private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);
  7. @Override
  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9. s
  10. // 拦截前的操作
  11. System.out.println("-----------前置拦截-----------");
  12. return true;
  13. }
  14. @Override
  15. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  16. // 拦截后的操作
  17. System.out.println("------------后置拦截------------");
  18. }
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  21. // 可以做一些清理工作
  22. }
  23. }

注册拦截器:

  1. package com.lxc.springboot.config;
  2. import com.lxc.springboot.intercetor.MyInterceptor;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  6. import javax.annotation.Resource;
  7. /**
  8. * @扩展springMVC
  9. * 第一步:
  10. * @Configuration 注解的作用:让这个类变为配置类
  11. * 第二步:
  12. * 必须实现 WebMvcConfigurer 接口
  13. */
  14. @Configuration
  15. public class SpringMvcConfig implements WebMvcConfigurer {
  16. @Resource
  17. private MyInterceptor myInterceptor;
  18. @Override
  19. public void addInterceptors(InterceptorRegistry registry) {
  20. // addInterceptor():注册拦截器,参数是一个拦截器
  21. // addPathPatterns(): 路径映射,哪些路径需要被拦截,/** 全部拦截
  22. // excludePathPatterns(): 排除哪些路径,不会被拦截
  23. registry.addInterceptor(myInterceptor)
  24. .addPathPatterns("/**")
  25. .excludePathPatterns("/login");
  26. }
  27. }

小例子

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

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

在配置类中注册拦截器:

  1. package com.lxc.springboot.config;
  2. import com.lxc.springboot.intercetor.LogInterceptor;
  3. import com.lxc.springboot.intercetor.MyInterceptor;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  7. import javax.annotation.Resource;
  8. @Configuration
  9. public class SpringMvcConfig implements WebMvcConfigurer {
  10. @Resource
  11. private MyInterceptor myInterceptor;
  12. @Resource
  13. private LogInterceptor logInterceptor;
  14. @Override
  15. public void addInterceptors(InterceptorRegistry registry) {
  16. registry.addInterceptor(logInterceptor)
  17. .addPathPatterns("/**")
  18. .excludePathPatterns("/login");
  19. }
  20. }

测试:

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号