SpringBoot里面添加Filter过滤器有两种方案,一种是servlet3.0引入的注解方式的@WebFilter 过滤器,一种是通过spring的FilterRegistrationBean来设置过滤器。其中,@WebFilter是之前web.xml配置Filter的一个改进,FilterRegistrationBean是一个bean管理器,将实现实现好Filter接口的过滤器直接注册到spring里面来统一管理,实现Filter的目的。
@WebFilter方式
@WebFilter实现Filter与传统实现Filter最大区别,在于通过@WebFilter注解取代了部署描述符web.xml。
通过一个示例看下
package com.filter.demo.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
@WebFilter(urlPatterns={"/login/dev/*", "/login/test/*"},
displayName="WebFilterDemo", description="WebFilter Demo",
filterName="WebFilterDemo")
@Component
public class WebFilterDemo implements Filter{
public void init(FilterConfig filterConfig) {
System.out.println("WebFilterDemo init()");
System.out.println(filterConfig.getFilterName());
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
String url = request.getRequestURL().toString();
System.out.println("Enter WebFilterDemo " + url);
arg2.doFilter(arg0, arg1);
}
}
代码中,可以看到,除了@WebFilter和@Component之外,其余的部分与之前认识的Filter无异
@WebFilter注解是标识该类为一个过滤器,如果在普通Tomcat容器中,配置@WebFilter就可以正常使用了,因为这里在spring容器中,所以需要添加@Component注解,将该Filter类放入到spring容器中,交由spring进行管理。
FilterRegistrationBean方式
FilterRegistrationBean方式中,定义Filter部分与之前无异
package com.filter.demo.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestFilter1 implements Filter{
public void init(FilterConfig config) {
System.out.println("TestFilter1 init()");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
System.out.println("Enter TestFilter1 ***");
chain.doFilter(arg0, arg1);
}
}
接下来,需要通过FilterRegistrationBean来管理定义的TestFilter1
package com.filter.demo.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebFilterRegistration {
@Bean
public FilterRegistrationBean<TestFilter1> registerFilter(){
FilterRegistrationBean<TestFilter1> registration = new FilterRegistrationBean<TestFilter1>();
registration.setFilter(new TestFilter1());
registration.addUrlPatterns("/*");
registration.setName("ParamFilter");
// 优先顺序,数字越小,越先执行
registration.setOrder(1);
return registration;
}
}
这样,便将TestFilter1交给了FilterRegistrationBean进行管理了,而该方法上面有@Bean进行修饰,会将该类交给spring容器,从而达到了在spring容器中进行过滤器的作用。
同样,如果有多个Filter交给FilterRegistrationBean进行管理时,可以通过setOrder( )方法指定过滤器的顺序,数字小的,会优先执行。
上面说了两种在springboot中可以定义使用的Filter,实际中使用时,尽量使用一种方式,@WebFilter方式呢,定义Filter方便些,但是如果有多个Filter时,不易控制Filter的顺序;FilterRegistrationBean管理Filter时,对多个Filter的顺序控制的比较好。