Filter在springboot中的使用方法详解
作者:bibiwannbe
这篇文章主要介绍了Filter在springboot中的使用方法详解,filter(过滤器)作用于在intreceptor(拦截器)之前,不像intreceptor一样依赖于springmvc框架,只需要依赖于serverlet,需要的朋友可以参考下
Filter 过滤器
Filter何时进行url过滤
filter(过滤器)作用于在intreceptor(拦截器)之前,不像intreceptor一样依赖于springmvc框架,只需要依赖于serverlet。
Filter在spring /springboot中如何使用
1.自定义Filter
比较原始的一种方法是定义一个MyFilter实现javax.servlet.Filter接口
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 对request或 response 进行处理
// 调用filter链中的下一个filter
filterChain.doFilter(servletRequest,servletResponse);
}
}另一种方法的自定义Filter,继承springframework.web.filter.OncePerRequestFilter,可以对同一个请求,只经过一次过滤
public class MyFilter extends OncePerRequestFilter {
/**此处不能@override doFilter方法
* 因为OncePerRequestFilter中 doFilter方法已经是final
*
*/
//自定义处理方法
public void interrupt(HttpServletResponse response, ErrorCode code){
//此处对response进行处理
}
//重载OnecePerRequestFilter方法
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain){
//调用自定义处理方法
interrupt(response,code);
//对request 、response进行处理
}
}OncePerRequestFilter中的方法
| 修饰符和类型 | 方法和描述 |
| void | doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 此doFilter实现存储“已过滤”的请求属性,如果属性已经存在,则继续进行而不再过滤。 |
| protected abstract void | doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)和doFilter相同功能,但保证在单个请求线程中每个请求只调用一次。 |
| protected java.lang.String | getAlreadyFilteredAttributeName() 返回标识已过滤请求的请求属性的名称。 |
| protected boolean | isAsyncDispatch(HttpServletRequest request) javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的调度程序类型意味着可以在单个请求的过程中在多个线程中调用过滤器。 |
| protected boolean | isAsyncStarted(HttpServletRequest request) 请求处理是否处于异步模式,这意味着在退出当前线程后不会提交响应 |
| protected boolean | shouldNotFilter(HttpServletRequest request) 可以在子类中重写以进行自定义筛选控制,返回true以避免过滤给定的请求。 |
| protected boolean | shouldNotFilterAsyncDispatch() javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的调度程序类型意味着可以在单个请求的过程中在多个线程中调用过滤器。 |
| protected boolean | shouldNotFilterErrorDispatch() 是否过滤错误调度,例如servlet容器处理和映射错误时web.xml |
2.注册自定义Filter
在springboot中可以写一个配置类,使用@Bean注入myFilterBean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
@Configuration
public class MyFilterConfig {
@Bean
public FilterRegistrationBean myFilterBean(MyFilter filter) {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(filter);//设置为自定义的过滤器MyFilter
filterRegistrationBean.addUrlPatterns("/*");//拦截所有请求
filterRegistrationBean.setOrder(1);//优先级为1
return filterRegistrationBean;
}
//可注册多个自定义的过滤器
}如果是使用xml配置则在web.xml配置如下( 注意配置多个filter时优先级由filter的配置顺序决定优先级)
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.text.filter.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>到此这篇关于Filter在springboot中的使用方法详解的文章就介绍到这了,更多相关Filter使用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
