SpringBoot中使用Filter


1.在传统web项目中添加filter

<filter> <filter-name>TestFilter</filter-name> <!--定义filter名称 和filter类 --> <filter-class>com.jiafeng.filter.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>TestFilter</filter-name> <url-pattern>/*</url-pattern> <!--设置filter拦截路径 --> <init-param> <param-name>paramName</param-name> <!-- 添加初始参数 --> <param-value>paramValue</param-value> </init-param> </filter-mapping>

2.在springboot中添加filter有两种方式

2.1代码注册方式

先定义Filter类:Myfilter,然后通过FilterRegistrationBean将filter注册到调用链中。


@Configuration   //相当于spring中的<beans>标签
public class WebConfiguration {

	@Bean   //相当于spring中<bean>标签
	public FilterRegistrationBean<MyFilter> testFilterRegistration() {
		FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
		registration.setFilter(new MyFilter());
		registration.addUrlPatterns("/*");//配置过滤路径
		registration.addInitParameter("paramName", "paramValue");//添加初始值
		registration.setName("myFilter");//设置filter名称
		registration.setOrder(1);//请求中过滤器执行的先后顺序,值越小越先执行
		return registration;
	}

	public class MyFilter implements Filter {

		@Override
		public void destroy() {
			System.out.println("销毁MyFilter");
		}

		@Override
		public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain)
				throws IOException, ServletException {
			HttpServletRequest request = (HttpServletRequest) sRequest;
			System.out.println("this is MyFilter url :" + request.getRequestURI());
			chain.doFilter(sRequest, sResponse);
		}

		@Override
		public void init(FilterConfig f) throws ServletException {
			System.out.println("初始化MyFilter");f.getInitParameter("");
} } }

2.2注解注册方式

定义过滤器类:HelloFilter,在过滤器类上添加@WebFilter注解配置过滤器名称、过滤路径等属性,通过@Order配置过滤器执行顺序。

注意使用@WebServlet、@WebFilter、@WebListener等servlet注解时需要在springboot的启动类上添加@ServletComponentScan注解,否则不会生效。

@WebFilter(urlPatterns="/*",filterName="helloFilter",initParams= {@WebInitParam(name="paramName",value="paramValue"),@WebInitParam(name="paramName2",value="paramValue2")})
@Order(2)
public class HelloFilter implements Filter {

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		System.out.println("执行过滤器Hello Filter !");
		filterChain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("初始化HelloFilter!");
	}

}

启动类

@SpringBootApplication
@ServletComponentScan
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

Spring在Java Filter注入Bean为Null的问题解决

 

在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性。(因为这两个归Web容器管理)可以用init(集承自HttpServlet后重写init方法)方法中实例化对象。

解决方法:

其中涉及到五种Spring实例化容器对象:

方法一(这种方式不符合Web工程,不要使用):在初始化时保存ApplicationContext对象

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");

说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

方法二(这种方式最简单):通过Spring提供的工具类获取ApplicationContext对象

复制代码
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");
复制代码

说明:这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

实例:

复制代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        ServletContext sc = req.getSession().getServletContext();
        XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
        if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
            usersService = (UsersService) cxt.getBean("usersService");
        
        Users users = this.usersService.queryByOpenid(openid);
复制代码
复制代码
public class WeiXinFilter implements Filter{
    
    private UsersService usersService;
    
    public void init(FilterConfig fConfig) throws ServletException {
        ServletContext sc = fConfig.getServletContext(); 
        XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
        if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
            usersService = (UsersService) cxt.getBean("usersService");        
    }
复制代码

注意:如果在Spring Boot项目上XmlWebApplicationContext可以不用要,直接使用WebApplicationContext替代。

方法三:继承自抽象类ApplicationObjectSupport

说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。

Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext对象注入。

方法四:继承自抽象类WebApplicationObjectSupport

说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

方法五:实现接口ApplicationContextAware

说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM