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) 此 |
protected abstract void | doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
protected java.lang.String | getAlreadyFilteredAttributeName() 返回标识已过滤请求的请求属性的名称。 |
protected boolean | isAsyncDispatch(HttpServletRequest request)
|
protected boolean | isAsyncStarted(HttpServletRequest request) 请求处理是否处于异步模式,这意味着在退出当前线程后不会提交响应 |
protected boolean | shouldNotFilter(HttpServletRequest request) 可以在子类中重写以进行自定义筛选控制,返回 |
protected boolean | shouldNotFilterAsyncDispatch()
|
protected boolean | shouldNotFilterErrorDispatch() 是否过滤错误调度,例如servlet容器处理和映射错误时 |
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>