欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 拦截器和过滤器

拦截器和过滤器

2024/10/24 9:18:39 来源:https://blog.csdn.net/wyy546792341/article/details/140939800  浏览:    关键词:拦截器和过滤器

关于过滤器和拦截器,一直容易混乱,小记一下。

 对比

  • Filter是servlet的规范,是web三大组件之一(Servlet,Filter,Listener),不依赖于spring;
  • 拦截器是一些框架中的概念,比如:Spring,用于拦截请求和响应的处理过程。拦截器通常是在Spring MVC的上下文中使用的,提供了对控制器(Controller)方法的拦截能力
  • 过滤器和拦截器功能类似,都是对请求预处理和拦截,
  • 都是链式的,Filter没有执行chain.doFilter或者拦截器的prehandler没有返回true,请求不再继续传递。

过滤器

在spring中,过滤器可以通过继承OncePerRequestFilter

@Order(998)
@Component
public class MyFilter01 extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {System.out.println("自定义Filter01");filterChain.doFilter(request,response);}
}

实现源生Filter

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
public class TraceIdFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代码(如果需要)}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String traceId = httpRequest.getHeader("Trace-ID");if (traceId == null || traceId.isEmpty()) {traceId = UUID.randomUUID().toString();}TraceIdHolder.setTraceId(traceId);httpResponse.setHeader("Trace-ID", traceId);try {chain.doFilter(request, response);} finally {TraceIdHolder.clear();}}@Overridepublic void destroy() {// 销毁代码(如果需要)}
}// 注册
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<TraceIdFilter> traceIdFilter() {FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new TraceIdFilter());registrationBean.addUrlPatterns("/*"); // 过滤所有路径return registrationBean;}
}

拦截器

拦截器可以实现HandlerInterceptor接口(需要注册)

//定义
public class MyInterceptor01 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("自定义拦截器01");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
// 注册
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor02()).order(667);registry.addInterceptor(new MyInterceptor01()).order(666);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com