SpringBoot基础篇(五)过滤器Filter(原生)

       过滤器Filter是出于客户端与服务器资源文件之间的一道过滤网。web开发人员通过Filter技术管理web服务器的所有资源,如jsp、servlet、静态图片文件或静态html文件等进行拦截,从而实现一些功能。如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

【注意】javax.servlet.Filter原生过滤器SpringBoot对其再次封装。

1、Filter接口源码说明

package javax.servlet;
import java.io.IOException;
public interface Filter {
//过滤器初始化,init方法只会执行一次
   public void init(FilterConfig filterConfig) throws ServletException;
//执行过滤器
   public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;
//过滤器销毁
   public void destroy();

}

    Filter的创建和销毁由Web服务器负责。Web应用程序启动时,Web服务器将创建Filter的实例对象,并调用其init()方法,读取web.xml配置,完成对象的初始化功能,从而为后续用户请求做好拦截的准备工作(Filter对象只会创建一次,init方法只会执行一次)。开发者通过init方法的参数可获得代表当前filter配置信息的FilterConfig 对象。

     当客户请求访问与过滤器关联的URL时,过滤器先将执行doFilter方法。FilterChain参数用于访问后续过滤器。Filter对象创建后会驻留内存中,当web应用移除或服务器停止时才销毁。在Web容器卸载Filter对象之前,destroy被调用。该方法在Filter的生命周期中仅执行一次,destroy方法可以释放过滤器使用的资源。

   Filter可以有很多个,一个个Filter组合起来就形成了一个FilterChain过滤器链。FilterChain过滤器链的执行顺序遵循先进后出的原则:当web客户端发送一个Request请求时,这个Request请求会经过FilterChain,由它利用dofilter()方法调用各个子Filter,至于子filter的执行顺序如何,则看客户端如何制定规则的。

2、Filter过滤器应用

【实现Filter接口】注意@WebFilter

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "",urlPatterns = "/*")
public class UserFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("---------UserFilter初始化----------->>");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("---------UserFilter执行过滤操作----------->>");
        filterChain.doFilter(servletRequest,servletResponse);
    }

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

【启动类配置@ServletComponentScan】

@SpringBootApplication
@ServletComponentScan
public class ShApp 
{
	protected final static Logger logger = LoggerFactory.getLogger(ShApp.class);	
	public static void main(String[] args) {
		ApplicationContext ctx =SpringApplication.run(ShApp.class, args);		
	}
}

3、过滤器中注解@WebFilter/@ServletCompnentScan

【@WebFilter注解】

@WebFilter注解:用于将一个类声明为过滤器,@WebFilter注解将会应用部署时被容器处理,容器根据具体的属性将相应的类部署为过滤器。在Web应用中使用监听器时,不需要在web.xml文件中配置监听器的相关描述信息。@WebFilter注解注解的属性有filterName、urlPatterns、value等。

(1)filterName属性用指定过滤器的name,等价于<filter-name>标签;

(2)urlPatterns属性用于指定一组过滤器的URL匹配模式,等价于xml配置文件中的<url-patten>标签;

  (3)value属性等价于urlPatterns属性,不可与urlPatterns属性同时使用。

【@ServletCompnentScan注解】

@ServletCompnentScan注解,使用该注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,不需要其他代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值