文章目录

  • 过滤器
    • 使用过滤器实现访问控制
    • 拦截器
  • 事件驱动模型

过滤器

在实际的开发过程中,可能会遇到这样一类需求:统计在线用户、敏感词过滤或者基于URL进行访问控制。这些需求有一个共同点——在每个接口被请求时都需要进行该类操作。换而言之,如果编写了对应以上需求的代码,在每一个接口的某处都需要对这些代码进行调用。不使用一些技巧的话,这个开发过程会变得异常烦琐。

Filter(过滤器)这一概念来源于“Servlet规范”,具体的功能实现由Servlet容器(即Spring Boot内容的Tomcat)提供。过滤器的主要职责在于对资源的请求与响应的过滤,对从客户端向服务端发送的请求进行过滤,也可以对服务端返回的响应进行处理。Filter与Servlet是有区别的。Filter虽然可以对请求与响应做出处理,但其本身并不可以产生响应。

使用过滤器实现访问控制

(1)创建一个需要实施访问控制的控制器。
一个简单的例子:
在路径src/main/java/com/example/myb-log/controller下创建SecretController.java:

@RequestMapping("/secret")
@RestController
public class SecretController {@GetMappingpublic String secret() {return "secret";}}

(2)创建用于身份认证的控制器。如果通过了认证,控制器将在Cookie中写入作为身份凭证的内容。
在controller路径下创建SessionController.java:

@RestController
@RequestMapping("/session")
public class SessionController {@PostMappingpublic String login(@RequestBody SessionQuery sessionQuery, HttpServletResponse response) {if (authenticate(sessionQuery)) {certificate(response);return "success";}//登陆失败返回错误return "failed";}private boolean authenticate(SessionQuery sessionQuery) {//简单的验证逻辑,仅作演示return Objects.equals(sessionQuery.getUsername(), "admin") &&Objects.equals(sessionQuery.getPassword(), "password");}private void certificate(HttpServletResponse response) {//将登陆凭证以cookie的形式返回给客户端Cookie credential = new Cookie("sessionId", "test-token");response.addCookie(credential);}}

(3)创建用于检查凭证的过滤器。过滤器通过检查请求中附带的Cookie内容,以确认用户的身份。
创建SessionFilter.java:

@Slf4j
@WebFilter(urlPatterns = "/secret/*")
public class SessionFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//读取CookieCookie[] cookies = Optional.ofNullable(((HttpServletRequest) servletRequest).getCookies()).orElse(new Cookie[0]);boolean unauthorized = true;for (Cookie cookie : cookies) {if ("sessionId".equals(cookie.getName()) && "test-token".equals(cookie.getValue())) {unauthorized = false;}}if (unauthorized) {log.error("UNAUTHORIZED");unauthorizedResp(servletResponse);}else {filterChain.doFilter(servletRequest, servletResponse);}}private void unauthorizedResp(ServletResponse response) throws IOException {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);httpResponse.setHeader("Content-type", "text/html;charset=UTF-8");httpResponse.setCharacterEncoding("UTF-8");httpResponse.getWriter().write("UNAUTHORIZED");}
}

(4)启用过滤器。需要在主类中使用@ServletComponentScan注解,以启用被注解@WebFilter修饰的过滤器。

(5)分别在请求登录接口前后访问“受保护”的路径,以确认访问控制是否生效。

拦截器

Interceptor(拦截器)这一功能由Spring提供。Interceptor与Filter类似,操作粒度更小,但整体功能不如Filter强大。Interceptor支持自定义预处理(preHandle)可以在此过程中决定是否禁止程序继续进行,自定义后续处理(postHandle)。 使用拦截器的前提是需要实现HandlerInterceptor接口。该接口包含三种主要方法: ·
 preHandle():在执行实际的处理程序之前调用,但尚未生成视图。 · 
 postHandle():处理程序执行后调用。 · 
 afterC ompletion():在请求已经响应并且视图生成完毕之后调用。
使用步骤:
首先创建一个继承HandlerInterceptorAdapter的拦截器类,使用日志打印请求中的参数。在路径src/main/java/com/example/myblog/interceptor下创建LogRequestInterceptor.java:
然后将拦截器配置到Spring上下文。在路径src/main/java/com/example/myblog/config下创建InterceptorConfig.java:

@Configuration
@RequiredArgsConstructor
public class InterceptorConfig implements WebMvcConfigurer {private final LogRequestInterceptor logRequestInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(logRequestInterceptor).addPathPatterns("/**");}
}

事件驱动模型

默认情况下,事件的发布与监听是同步执行的。当要用到异步事件时,需要进行额外的配置。具体方式在于创建ApplicationEventMulticaster的JavaBean。在路径src/main/java/com/example/myblog/config下创建AsynchronousEventsConfig.java:

@Configuration
public class AsynchronousEventsConfig {@Bean(name = "applicationEventMulticaster")public ApplicationEventMulticaster simpleApplicationEventMulticaster() {SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());return eventMulticaster;}
}

【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型相关推荐

  1. springmvc学习笔记二:重定向,拦截器,参数绑定

    springmvc学习笔记二:重定向,拦截器,参数绑定 Controller方法返回值 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加mo ...

  2. SpringBoot实现过滤器、拦截器与切片

    作者:七印miss juejin.im/post/5c6901206fb9a049af6dcdcf Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤 ...

  3. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  4. SpringBoot实现过滤器、拦截器与切片源码分析

    过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...

  5. SpringBoot整合过滤器、拦截器

    目录 过滤器.拦截器的区别 过滤器.拦截器的使用场景 同时存在过滤器.拦截器时的执行流程 springboot整合过滤器 编写过滤器 配置过滤器 springboot整合拦截器 编写拦截器 配置拦截器 ...

  6. SpringBoot配置过滤器和拦截器

    一.概念 1简介 过滤器是JavaEE中Servlet规范的一个组件,通过Filter技术,可以实现用户访问某个资源前,对访问的请求和响应进行拦截 拦截器(Interceptor)类似于Servlet ...

  7. 【学习日记2023.5.8】之 springboot案例之登录功能(会话技术_JWT令牌_过滤器_拦截器)

    文章目录 1. 案例-登录认证 1. 1登录功能 1.1.1 需求 1.1.2 接口文档 1.1.3 思路分析 1.1.4 功能开发 1.1.5 测试 1.1.6 全后端联调 1.2 登录校验 1.2 ...

  8. springboot 控制台输出错误信息_高级码农Spring Boot实战进阶之过滤器、拦截器的使用...

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

  9. 云笔记项目-过滤器与拦截器学习

    在做云笔记项目的过程中,没有登录的情况下,也可以直接访问edit.html页面.这个跟以前自己用Servlet做过的PadAndFilterManagement情况类似,当时在没有登录的情况下可以访问 ...

最新文章

  1. 奇点、技术失控与技术启示录
  2. 【问题记录】eclipse启动web项目时,spring会初始化两次
  3. yum go linux,使用yum安装Go(Golang)
  4. 3dmax高版本转低版本插件_视频编辑干货资料:低版本打开高版本pr文件
  5. LQ训练营(C++)学习笔记_常见动态规划模型
  6. 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
  7. 04737 c++ 自学考试2019版 第二章课后程序设计题 3
  8. 2021年最新的Python大厂Python基础编程
  9. DNN-两种矩阵相乘的理解
  10. 在Eclipse中手动安装pydev插件
  11. MATLAB小波分析工具箱的使用
  12. rar怎么用计算机打开,解答电脑rar文件怎么打开
  13. 微信公众号,带参二维码/推广二维码的使用
  14. stm32中的“hello world”
  15. CSS实现的带头像的彩色垂直菜单源码
  16. 你好,我是社恐患者的猫
  17. java root权限_Android应用获取Root权限
  18. 2021年2月22日 星期一 农历八九 晴
  19. 华为云FusionInsight MRS容灾:大数据两地三中心的容灾也可以如此省心
  20. 整理 华为AP-3010DN_V2配置创建wifi

热门文章

  1. matlab 双向链表,双向链表基本操作(C语言实现)
  2. 设置mysql整形_mysql 整型字段设计
  3. java xml 反射_java使用dom4j解析xml配置文件实现抽象工厂反射示例
  4. python mysql 分号_Python中使用MySQL
  5. appium java版本错误_升级Appium最新java-client 6.0.0包后-问题来了...
  6. Flume fan out(扇出)详解
  7. 在python实现快速傅里叶变换FFT与频域滤波
  8. c语言的程序框图怎么写,C语言课程设计————写下流程图! 谢谢
  9. 文末送书丨深度迁移学习方法的基本思路
  10. 旷厂练习生 | 小白进阶之三个月发表一篇CVPR