环境描述:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
前言在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的一般逻辑。这就是过滤器、拦截器和监听器的用途。它们可以帮助我们在处理请求和响应之前或之后执行一些一般逻辑。
摘要本文将介绍Spring 在Boot应用程序中使用过滤器、拦截器和监控器的技能。我们将讨论它们之间的区别以及何时使用它们。我们还将提供代码示例,以帮助您在自己的应用程序中使用它们。
正文过滤器过滤器是在要求进入servlet容器或响应离开容器之前或之后执行的,用于在处理要求或响应之前/之后修改它们。 Spring 在Boot中,我们可以使用Filter接口来实现过滤器。以下是一个例子:
@Componentpublic class MyFilter implements Filter { @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; // 执行一些通用逻辑 System.out.println( "Logging Request {} : {}" + req.getMethod() + " " + req.getRequestURI()); // 继续处理请求 chain.doFilter(request, response); // 执行一些通用逻辑 System.out.println( "Logging Response :{}" + res.getContentType()); } // 省略其他方法}
在上面的例子中,我们定义了一个名字MyFilter
过滤器。它将在请求进入servlet容器之前和离开容器之后执行。我们可以在这里执行一些通用逻辑,如记录请求/响应、修改请求/响应等。
为了在我们的应用程序中使用这个过滤器,我们需要在Spring中注册它 在Boot应用中。我们可以使用它@ServletComponentScan
注释自动扫描我们的过滤器。例如:
@SpringBootApplication@ServletComponentScanpublic class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); }}
拦截器拦截器类似于过滤器,但它们为处理请求和响应提供了更灵活的方法。拦截器只能与Spring相似 MVC一起使用,允许我们在控制器处理请求之前或之后执行逻辑。 拦截器可以为包含控制器的所有请求执行一般逻辑,并为每个控制器或每个请求执行一个特定的逻辑。
Spring 在boot中,我们可以使用HandlerInterceptor接口来实现拦截。以下是一个例子:
@Componentpublic class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 执行一些通用逻辑 System.out.println( "Logging Request {} : {}" + request.getMethod() + " " + request.getRequestURI()); return true; } // 省略其他方法}
在上面的例子中,我们定义了一个名字MyInterceptor
拦截器。它将在控制器处理请求之前执行。我们可以在这里执行一些通用逻辑,如记录请求、验证请求参数等。
为了在我们的应用程序中使用这个拦截器,我们需要将其注册为Spring 在boot应用程序中。我们可以使用WebMvcconfigurer接口注册拦截器。例如:
@Configurationpublic class AppConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); }}
在上面的例子中,我们将MyInterceptor
添加到拦截器注册表中。
监听器是Spring应用程序中处理事件的通用机制。 Spring Boot应用程序中的事件可以是Web请求、应用程序启动/停止等。 当事件发生时,监控器可以监控这些事件并执行一些逻辑。
Spring 在boot中,我们可以使用aplicationlistener接口来实现监听器。以下是一个例子:
@Componentpublic class MyAppListener implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent event) { // 处理事件 System.out.println("Event: " + event.getClass()); }}
在上面的例子中,我们定义了一个名字MyAppListener
监听器。它将在应用程序中的任何事件发生时执行。我们可以在这里执行一些逻辑,例如记录事件、修改应用程序状态等。
为了将监听器应用于我们的应用程序,我们需要将其注册为Spring 在Boot应用中。我们可以使用它@Component
注释将其定义为组件。
在上面的例子中,我们实现了一个名字MyFilter
过滤器。以下是过滤器中常用的一些方法:
doFilter
:执行过滤器逻辑。请求和响应可以在这里修改。init
:初始化过滤器。在实例化过滤器时调用。destroy
:销毁过滤器。销毁过滤器时调用。
在上面的例子中,我们实现了一个名字MyInterceptor
拦截器。以下是拦截器中常用的一些方法:
preHandle
:在处理控制器请求之前执行。请求、记录请求等。可以在这里验证。postHandle
:在控制器处理请求后执行,但在响应发送到客户端之前。此处可修改响应、记录响应等。afterCompletion
:响应发送到客户端后执行。响应可以在这里记录。
在上面的例子中,我们实现了一个名字MyAppListener
监听器。以下是监听器中常用的一些方法:
onApplicationEvent
:处理事件。这里可以记录事件,修改应用程序状态等。
优点:
- 可拦截请求和响应,方便处理请求和响应;
- 可对字符编码转换、session管理等要求进行预处理和后处理;
- 对特定URL或路径进行特定处理和拦截;
- 可与Servlet容器无缝结合,使用方便。
缺点:
- Servlet容器的上下文信息无法获取;
- Httpservletrequest和Httpservletresponse对象无法操作,只能读取信息和设置信息;
- 过滤器只能拦截Servlet请求,不能拦截其他请求;
- 过滤器只能处理请求,不能处理响应;
- 不能保证过滤器的执行顺序。
优点:
- 可拦截请求和响应,方便处理请求和响应;
- Servlet容器的上下文信息可以获取;
- 可操作Httpservletrequest和Httpservletresponse对象;
- 请求可以预处理和后处理;
- 对特定URL或路径进行特定处理和拦截;
- 可以权限控制Controller方法。
缺点:
- Servlet容器没有直接支持,需要额外配置;
- 只能在Spring中拦截拦截器 在MVC中使用。
优点:
- Servlet容器的生命周期事件,如初始化、销毁等;
- HTTPS可以监控创建和销毁ervletrequest和Httpservletresponse对象;
- Servletcontext可以实现、监控HttpSession和Servletrequest等对象。
缺点:
- 只能监控事件,不能处理请求;
- 不能保证监听器的执行顺序;
- 监听器只对WEB应用程序有效。
过滤器、拦截器和监听器都是特定处理应用程序的工具,但它们有不同的工作方法和用途。
过滤器(Filter)过滤器是Servlet规范中的一个组件,用于拦截网络应用程序的请求和响应,可以预处理请求,也可以在响应发送到客户端之前进行后处理。过滤器通常用于实现安全、日志记录、压缩、字符编码转换等功能。其优点是可以统一处理Web容器级别的请求,缺点是只能在Servlet规范范围内使用。
拦截器(Interceptor)Springg拦截器 MVC框架中的一个组件用于拦截和处理请求和响应。与过滤器不同,拦截器可以执行一些其他逻辑,如安全性、日志记录、性能监控、事务管理等。Spring 使用MVC框架的任何级别,其优点是灵活性高,缺点是需要在代码中引用显式。
监听器(Listener)显示器是Java Servlet规范中的一个组件用于监控Web应用程序的事件,如Servletcontext、HttpSession、Servletrequest等事件。它可以在应用程序运行过程中动态捕获这些事件,并执行一些相应的逻辑。其优点是可以根据需要监控应用程序中的各种事件并进行相应的处理。缺点是只能监控一些特定的事件。
综上所述,过滤器、拦截器和监控器都有自己的适用场合和优缺点。过滤器适用于统一处理请求和响应的场合;拦截器适用于在请求处理前后执行其他逻辑的场合;监控器适用于监控和处理应用程序中的事件。
附录源码上述所有涉及的源码均已同步上传。「GitHub」,为学生提供一对一的参考学习,帮助您更快地掌握。
总结过滤器、拦截器和监听器是Web应用程序开发中常用的工具,用于在处理请求和响应之前或之后执行特定逻辑。过滤器可以在请求进入Servlet容器之前或响应离开容器之后执行。拦截器只能与Spring一起使用 MVC一起使用,在控制器处理要求之前或之后执行逻辑,监听器可以在应用程序中处理事件。三种工具各有优缺点,使用场景也不同。根据需要选择合适的工具可以提高开发效率和应用质量。