您的位置:首页 > 编程语言 > Java开发

SpringBoot之过滤器Filter

2017-12-28 11:24 357 查看

Filter简介

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Filter实现

继承Filter接口

@Component
@WebFilter(filterName="过滤器名称", urlPatterns = "/*") //过滤地址
public class TimeFilter implements Filter {
private Logger logger = Logger.getLogger(this.getClass());

/**
* 容器启动时初始化init
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("==============TimeFilter初始化====================");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
logger.info("==============进入doFilter====================");
long l = System.currentTimeMillis();
filterChain.doFilter(servletRequest, servletResponse);
logger.info("==============退出doFilter====================耗时:" + (System.currentTimeMillis() - l));
}

@Override
public void destroy() {
logger.info("==============TimeFilter销毁====================");
}
}


实际继承Filter接口,添加@Component,@WebFilter后一个过滤器就已经实现了。

init(FilterConfig filterConfig)
:容器启动时就执行此方法,FilterConfig 有什么属性呢?

String getFilterName();//得到filter的名称。
String getInitParameter(String name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext();//返回Servlet上下文对象的引用。


doFilter
:这是过滤器核心方法,客户端请求我们接口时,先执行
filterChain.doFilter(servletRequest, servletResponse);
前面的方法,当执行到
filterChain.doFilter
方法时,会到相应请求接口(或下一个过滤器),接口返回后,会
跳到
filterChain.doFilter后面的代码。

destroy():
容器销毁后执行此方法,主要进行一些清除操作。

注册bean方法实现

上面实现是通过@Component,@WebFilter方法实现的,在springBoot中可以以注册bean的方法(不写那两个注解)实现

@Configuration
public class TimeFilerConfig {
/**
* 注册自定义TimeFilter的bean
*/
@Bean(name = "timeFilter")
public FilterRegistrationBean timeFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
Filter timeFilter = new TimeFilter();
filterRegistrationBean.setFilter(timeFilter);
//设置拦截路径
ArrayList<String> urls = new ArrayList<>();
urls.add("/*");
filterRegistrationBean.setUrlPatterns(urls);
//如果多个Filter,指定Filter的顺序,数字越小越先开始
filterRegistrationBean.setOrder(10);
return filterRegistrationBean;
}
}


FilterRegistrationBean 还有其它的属性设值方式,自行查找资料。

如果注册多个Filter如何实现?

@Configuration
public class TimeFilerConfig {
/**
* 注册自定义TimeFilter的bean
*/
@Bean(name = "timeFilter")
public FilterRegistrationBean timeFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
Filter timeFilter = new TimeFilter();
filterRegistrationBean.setFilter(timeFilter);
//设置拦截路径
ArrayList<String> urls = new ArrayList<>();
urls.add("/*");
filterRegistrationBean.setUrlPatterns(urls);
//如果多个Filter,指定Filter的顺序,数字越小越先开始
filterRegistrationBean.setOrder(10);
return filterRegistrationBean;
}

/**
* 注册自定义timeTwoFilter的bean
*/
@Bean(name = "timeTwoFilter")
public FilterRegistrationBean timeTwoFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
Filter timeFilter = new TimeTwoFilter();
filterRegistrationBean.setFilter(timeFilter);
//设置拦截路径
ArrayList<String> urls = new ArrayList<>();
urls.add("/*");
filterRegistrationBean.setUrlPatterns(urls);
//如果多个Filter,指定Filter的顺序
filterRegistrationBean.setOrder(5);
return filterRegistrationBean;
}
}


执行流程

单个Filter



多个Filter



应用

请参考我的另一篇博客:springBoot之过滤器解决前端跨域问题

拦截器和过滤器区别参考:http://blog.csdn.net/Kincym/article/details/78920918
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: