拦截器和过滤器的区别
- Filter是基于函数回调的,而Interceptor则是基于Java反射的。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
执行顺序下面借用网上的一张图给大家解释
下面给大家列出来一些用处
Filter(过滤器) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
切片 (Aspect) : 可以拿到方法的参数,但是却拿不到http请求和响应的对象
配置类
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SzConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");
}
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
过滤器
@Slf4j
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("初始化容器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
//封装log实体类
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println(CollectionUtils.isEmpty(parameterMap));
log.info("请求来源: =》{}", request.getRemoteAddr());
log.info("请求URI:{}", request.getRequestURI());
log.info("请求方式:{}", request.getMethod());
log.info("请求参数:{}", parameterMap.toString());
log.info("=====================LogFilter前置 end=====================>");
for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
log.info("请求参数名称:{}", entry.getKey());
log.info("请求参数值:{}", entry.getValue());
}
//消耗时间
long start = System.currentTimeMillis();
// 执行主体方法start==================================================================
filterChain.doFilter(request, response);
// 执行主体方法 end==================================================================
//耗时
long time = System.currentTimeMillis() - start;
log.info("耗时(毫秒):{}", time);
}
@Override
public void destroy() {
log.info("容器销毁");
}
}
拦截器
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("【MyInterceptor】调用了:{}", request.getRequestURI());
request.setAttribute("requestTime", System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("类名:{}",((HandlerMethod) handler).getBean().getClass().getName());
log.info("方法名:{}",((HandlerMethod) handler).getMethod().getName());
log.info("【MyInterceptor】执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long duration = (System.currentTimeMillis() - (Long) request.getAttribute("requestTime"));
log.info("【MyInterceptor】[{}]调用耗时:{}ms", request.getRequestURI(), duration);
}
}