SpringBoot的Filter过滤器方案

      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的顺序控制的比较好。

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/85790765