内容简介:Filter接口定义在自定义的过滤器需要实现通过
Filter接口定义在 javax.servlet
包中,是Servlet规范定义的,作用于Request/Response前后,被Servlet容器调用,Filter不能使用Spring容器资源。
实现一个Filter
自定义的过滤器需要实现 javax.servlet.Filter
,Filter接口中有三个方法:
-
init(FilterConfig filterConfig):过滤器初始化的被调用。 -
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain):在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作,chain.doFiter()执行下一个过滤器或者业务处理器。 -
destory():过滤器销毁的时候被调用。
在Spring容器中使用过滤器
- 通过FilterRegistrationBean
@Configuration
public class WebConfig{
@Bean
public FilterRegistrationBean xxxFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new xxxFilter());
registrationBean.setUrlPatterns(Arrays.asList("/*"));
registrationBean.setOrder(1); // 过滤器的优先级
return registrationBean;
}
}
复制代码
-
通过
@WebFilter和@ServletComponentScan
通过 @WebFilter
的方式定义Filter,默认使用Filter的类名设置优先级。使用 FilterRegistrationBean
可以指定优先级。Filter使用白名单过滤Url的方式,配置需要拦截的Url,如果想设置不过滤某些Url需要在 doFilter
方法中指定。
二、Interceptor(拦截器)
定义一个Interceptor需要实现 org.springframework.web.servlet.HandlerInterceptor
接口,Interceptor是Spring容器定义的,它可以使用Spring容器的任何资源,只要通过IoC注入到Interceptor即可,Interceptor可以深入到业务处理方法的执行前后和抛出异常的时候,而Filerter无法做到这一点,所以Interceptor相比Filter具有更大的弹性。
实现一个Interceptor
实现 HandlerInterceptor
或者继承 HandlerInterceptorAdapter
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
复制代码
-
preHandle:在业务处理器处理请求之前被调用。
-
postHandle:在业务处理器处理请求后并生成视图前被调用,此时有机会修改ModelAndView。
-
afterCompletion:业务处理处理器处理完请求后(已经渲染视图)被执行,并可以处理业务方法发生异常的场景。
在Spring容器中使用拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new TimeInterceptor());
registration.excludePathPatterns("/user");
registration.excludePathPatterns("/*");
}
}
复制代码
Interceptor既可以指定要过滤的Url也可以指定不拦截的Url,缺省情况拦截所有Url。
以上所述就是小编给大家介绍的《SpringBoot中使用Filter和Interceptor》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First HTML and CSS
Elisabeth Robson、Eric Freeman / O'Reilly Media / 2012-9-8 / USD 39.99
Tired of reading HTML books that only make sense after you're an expert? Then it's about time you picked up Head First HTML and really learned HTML. You want to learn HTML so you can finally create th......一起来看看 《Head First HTML and CSS》 这本书的介绍吧!