spring boot给我们提供了一个HandlerInteceptor接口帮助我们实现拦截器功能。

在HandlerInteceptor接口中,一共有三个default方法(这是jdk8的新特性,用来在接口中编写带有方法体的方法。实现接口可以不重写default方法,默认调用的仍是接口中的default方法体)

public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

boolean preHandle:会在controller处理前调用该方法,方法返回true则进入对应的controller。方法返回false则不会进入controller。可以用来编码,安全控制,权限校验等。
void postHandle:在controller处理完成返回ModelAndView后执行。此时还没有进行视图渲染,还可以修改ModelAndView。
void afterCompletion:整个请求已经处理完成了,可能返回了正常的请求结果,也可能返回一个异常。

下面我们来做一个简单的demo。

先定义一个controller:

@RestController
public class UserController {@GetMapping("users/{id}")public String getUser(@PathVariable("id") String id) {System.out.println("controller[url=users/" + id + "]");return "testUser";}@GetMapping("users/login")public String test(User user, Model model) {System.out.println("controller[url=users/login]");model.addAttribute("id", user.getId());model.addAttribute("name", user.getName());model.addAttribute("password", user.getPassword());model.addAttribute("mail", user.getMail());return "index";}
}

里面提供了两个请求链接:/users/{id}和/users/login,这里为了简单方便,我们均将请求方式设置为get。

定义一个拦截器UserInteceptor(这里先测试第一个方法preHandle):

@Component
public class UserInteceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle;");Map<String, String[]> map = request.getParameterMap();map.forEach((k, v) -> {System.out.println("[Key=" + k + ";Value=" + StringUtils.join(v) + "];");});return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}

然后将拦截器添加进容器中,设定它的拦截路径为/users/**:

@Configuration
public class InteceptorConfig implements WebMvcConfigurer {@Autowiredprivate UserInteceptor userInteceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userInteceptor).addPathPatterns("/users/*");}
}

就此一个简单的项目已经构成,我们启动程序,然后访问/users/login?id=1&username=yxf&password=123&mail=5@qq.com

可以看到访问结果:

preHandle; //----------------------------调用了preHandle方法
[Key=id;Value=1]; //---------------------打印request中的id
[Key=name;Value=yxf]; //-----------------打印request中的name
[Key=password;Value=123]; //-------------打印request中的password
[Key=mail;Value=5@qq.com]; //------------打印request中的mail
controller[url=users/login] //-----------在preHandle之后,这里进入UserController的test方法。
postHandle //----------------------------controller处理完成后调用PostHandle方法。//---------------在这中间其实还有dispatchServlet调用视图解析器对View的解析等------------------
afterCompletion //-----------------------postHandle处理完成后调用afterCompletion。

顺序是按照preHandle→Controller→postHandle→视图渲染器→afterCompletion的顺序执行。

转载于:https://www.cnblogs.com/yxth/p/10865396.html

spring boot--拦截器实现相关推荐

  1. Spring Boot拦截器(WebMvcConfigurerAdapter)

    直接按我的步骤走都没有问题: 1 配置自定义的拦截器: package com.configs;import org.slf4j.Logger; import org.slf4j.LoggerFact ...

  2. 解决Spring Boot 拦截器注入service为空的问题

    解决Spring Boot 拦截器注入service为空的问题 参考文章: (1)解决Spring Boot 拦截器注入service为空的问题 (2)https://www.cnblogs.com/ ...

  3. 使用spring boot拦截器实现青少年模式

    思路方法一: 便用Spring Boot拦截器采累计在线时间采实现青少年模式的步骤,可以参考以卜步骤: 1.创建一个拦截器类,实现Handlerlnterceptor 接口. 2.在拦截器类中,定义一 ...

  4. spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...

    众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...

  5. Spring boot拦截器登录检查

    拦截器 进行登录检查 从登录页面跳转到成功页面之后 为了防止表单重复提交 配置视图映射,利用重定向到成功页面 此时,在浏览器直接输入,配置的视图映射地址 也可以直接映射.跳转到成功页面 登录页面,也就 ...

  6. Spring Boot 拦截器

    (一)拦截器概述 1.1拦截器介绍 拦截器的作用类似于Servlet 中的Filter,都可以用于对处理器进行预处理和后处理.在Spring MVC 与Spring Boot 中使用拦截器一般是实现H ...

  7. Spring Boot拦截器(Interceptor)详解

    写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站. 文章目录 Interceptor 介绍 Interceptor 作用 自定义 Inte ...

  8. Spring Boot 拦截器无效,不起作用

    这个问题一般是解决WebMvcConfigurerAdapter过时问题造成的.导致这个问题可能有两个原因:一个是拦截器写错了,另一个是拦截器配置错了. 1.需求是这样的 拦截所有的api请求,判断其 ...

  9. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  10. spring boot拦截器 过滤器

    1.拦截器 登录拦截 自定义拦截路径 //全局配置继承WebMvcConfigurer接口 @Configuration public class MyHandler implements WebMv ...

最新文章

  1. Maven中jar包冲突的解决方式
  2. 《编写高质量代码:改善Java程序的151个建议》笔记
  3. HTML IFRAME 用法小总结
  4. spring 循环依赖_简单说说 Spring 的循环依赖
  5. Label 表达式绑定
  6. 深入浅出VC++串口编程--短信应用开发
  7. 罗永浩推出新一代坚果手机,比AI亮眼的是AV能力
  8. 分享一份自己整理的PPT--数据分析师的业务流程和常规思维
  9. android shn1 获取_华为光猫获得Root Shell(shell的root权限)详细说明,接力sdgaojian发帖。...
  10. WT2003H语音芯片在红绿灯上的运用,一款可远程更新的语音IC方案
  11. linux shell 切换目录,如何在Shell中快速切换目录?
  12. Python爬虫入门教程 7-100 蜂鸟网图片爬取之二 1
  13. nginx配置前端网站
  14. AutoCAD .Net 颜色系统
  15. SAP常见问题与解决办法(转)
  16. 虚拟机设置共享文件夹
  17. MatConvNet的CPU和GPU编译配置
  18. Qt获取当前系统时间和时间戳及其之间转换
  19. Android S XTS 测试入门
  20. windows安全警报怎么关闭_永久关闭WIN10自动杀毒(windows安全中心)

热门文章

  1. python随机生成中文句子_python – 如何使用NLTK从诱导语法中生成句子?
  2. 绘制箱线图的标签python_利用Python - Matplotlib 绘制箱线图
  3. python pandas 读取数据库_数据分析-pandas从数据库读取数据
  4. 乱世寻龙java_乱世王者寻龙季怎么玩?乱世王者寻龙季玩法技巧一览
  5. au人声处理_如何使用AU软件为视频降噪?
  6. linux执行多个命令_您必须知道的前50多个Linux命令
  7. sql主键_SQL主键
  8. linux islower_Python字符串islower()
  9. Android ViewModel
  10. iOS UISearchController和UITableView