一:Filter介绍
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
二、Filter是如何实现拦截的?
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
- 调用目标资源之前,让一段代码执行。
- 是否调用目标资源(即是否让用户访问web资源)。
- 调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。
过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用
三、SpringBoot自定义Filter
在springboot中,使用Filter也有两种方式,注解注册Filter,和代码注册,此次只介绍注解方式
在SpringBoot中一个类实现Filter接口,并通过简单的@WebFilter和@Configuration注解配置即可实现过滤器功能,代码示例如下
/**
* 过滤器
* filter的三种典型应用:
*1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,即是否让目标资源执行
*2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
*3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
*/
@WebFilter(filterName = "suFilter",urlPatterns = "/api/v2/suning/*")
@Configuration
public class suFilter implements Filter{
private Logger logger=LoggerFactory.getLogger(suFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("suFilter is init+>>>>>");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
logger.info("doFilter is start+>>>>");
HttpServletRequest request = ((HttpServletRequest) servletRequest);
String requestURI = request.getRequestURI();
logger.info("requestURI is " + requestURI);
//调用该方法后,表示过滤器经过原来的url请求处理方法
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
logger.info("suFilter is destroy+>>>>>");
}
}
···
WebFilter主要参数
| 参数 |类型 | 功能 |
| - | :-: | :-: |
| description | String| Filter的简单描述 |
| displayName | String | Filter的显示名称 |
| initParams | String[] | Filter的初始化参数 |
| filterName | String | Filter的名称 |
| servletNames | String[] | 使用该Filter的Servlet的名称 |
| urlPatterns | String[] | 使用该Filter的路径URL |
| dispatcherTypes | DispatcherType | 使用该Filter的模式 |
| asyncSupported | boolean | 是否支持异步 |