springboot中使用拦截器、监听器、过滤器
拦截器、过滤器、监听器在web项目中很常见,这里对springboot中怎么去使用做一个总结.
1. 拦截器(Interceptor)
我们需要对一个类实现HandlerInterceptor接口, 默认会实现其中的三个方法,preHandle,postHandle ,afterCompletion,其中preHandle实在Controller方法调用之前执行,postHandle是在请求处理之后进行调用,但是在视图渲染之前,即Controller方法调用之后执行,afterCompletion方法是在整个请求结束之后被调用,也是在DispatcherServlet渲染了对应识图之后执行,主要用于资源清理工作。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 需要config配置类配合,看config目录
* 路径只有走DispatcherServlet,才会被拦截,默认静态资源不会被拦截
* @author jared
*/
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//controller方法调用之前
System.out.println("我没进controller");
return true;
} @Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//请求处理之后进行调用,但是在视图被渲染之前,即Controller方法调用之后
System.out.println("我进拦截器了");
} @Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行,主要是用于进行资源清理工作
}
}
路径只有走DispacherServlet,才会被拦截,默认静态资源不会被拦截,拦截器需要注册,一般需要在config中注册该拦截器,才能在项目中使用。
import com.aits.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter{
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");
super.addInterceptors(registry);
}
}
2. 过滤器
过滤器需要实现ServletContextListener,需要springboot主方法类加入@ServletComponentScan注解。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; /**
* 会过滤到地址栏为以下参数的请求
* 需要主类加入@ServletComponentScan
*/
@WebFilter(filterName = "firstFilter",urlPatterns = {
"/test/*","/hello/*"
})
public class FirstFilter implements Filter {
private static Logger LOG= LoggerFactory.getLogger(FirstFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) servletRequest;
String requestURI=req.getRequestURI();
LOG.info("过滤到的请求-->"+requestURI);
} @Override
public void destroy() { }
} @SpringBootApplication
//开启servlet注解
@ServletComponentScan
public class JaredMain { public static void main(String[] args) {
SpringApplication.run(JaredMain.class, args);
} }
3. 监听器
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; /**
* 需要主类加入
* @ServletComponentScan
*/
@WebListener
public class FirstListener implements ServletContextListener{
private static Logger LOG= LoggerFactory.getLogger(FirstListener.class);
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
LOG.info("firstListener 初始化...");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
LOG.info("FirstListener 销毁...");
}
}
- 区别
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调
- 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
- 用途
过滤器,主要的用途是过滤字符编码、做一些业务逻辑判断等。
监听器,做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等
拦截器,在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制

springboot中使用拦截器、监听器、过滤器的更多相关文章
- 在springboot中使用拦截器
在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...
- springmvc以及springboot中的拦截器配置
拦截器两种实现 如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...
- SpringMVC中的拦截器、过滤器的区别、处理异常
1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...
- Springboot中SpringMvc拦截器配置与应用(实战)
一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...
- 解决 Springboot中Interceptor拦截器中依赖注入失败
问题: 在Springboot拦截器Interceptor中使用@Resource依赖注入时,发现运行的时候被注解的对象居然是null,没被注入进去 原配置为: @Configurationpubli ...
- springboot中使用拦截器
5.1 回顾SpringMVC使用拦截器步骤 自定义拦截器类,实现HandlerInterceptor接口 注册拦截器类 5.2 Spring Boot使用拦截器步骤 5.2.1 按照S ...
- springboot(五).如何在springboot项目中使用拦截器
在每个项目中,拦截器都是我们经常会去使用的东西,基本上任一一个项目都缺不了拦截器的使用. 如日志记录.登录验证,session验证等,都需要拦截器来拦截URL请求,那springboot中的拦截器是如 ...
- SpringBoot使用拦截器、过滤器、监听器
目录 ## 过滤器 PS: 原文链接https://www.cnblogs.com/haixiang/p/12000685.html,转载请注明出处 过滤器简介 过滤器的使用 拦截器 拦截器介绍 使用 ...
- struts2中拦截器与过滤器的区别
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器. 3.拦截器只能对Action请求起作用,而过滤器则可以对几乎 ...
随机推荐
- http和ftp下载的区别
HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper Text Transportation Pr ...
- iperf3 不支持双工模式
iperf 2.05的时候,客户端可以使用参数"-d"来进行双工测试,先测试发送,client向server发送数据,等到测试时间结束后(默认为10s,可以通过-t选项来更改),然 ...
- ansible笔记(10):初识ansible playbook
ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...
- python读写csv文件
文章链接:https://www.cnblogs.com/cloud-ken/p/8432999.html Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗 ...
- IntelliJ IDEA插件 - ApiDebugger
IntelliJ IDEA插件 - ApiDebuggerApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你 ...
- ios 调整 label 的字体行间距
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 200) ...
- python 排序 sort和sorted
当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建方法sort() 可以直接对列表进行排序 用法: list. ...
- SpringData分页功能
在SpringData中实现分页功能我们需要将接口实现PagingAndSortingRepository这个接口提供了分页查询的方法 Page<T> findAll(Pageable p ...
- LeetCode(90):子集 II
Medium! 题目描述: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1 ...
- python网络爬虫笔记(三)
一.切片和迭代 1.列表生成式 2.生成器的generate,但是generate保存的是算法,所以可以迭代计算,没有必要,每次调用generate 二.iteration 循环 1.凡是作用于for ...