SptingBoot 实战(3):SpringBoot + 过滤器

一:Filter介绍

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

  SptingBoot 实战(3):SpringBoot + 过滤器_第1张图片

 

 

二、Filter是如何实现拦截的?

  Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

  1. 调用目标资源之前,让一段代码执行。
  2. 是否调用目标资源(即是否让用户访问web资源)。
  3. 调用目标资源之后,让一段代码执行。

  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用

三、SpringBoot自定义Filter

在springboot中,使用Filter也有两种方式,注解注册Filter,和代码注册,此次只介绍注解方式

在SpringBoot中一个类实现Filter接口,并通过简单的@WebFilter和@Configuration注解配置即可实现过滤器功能,代码示例如下

/**
 * 过滤器
 * filter的三种典型应用:
 *1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,即是否让目标资源执行
 *2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
 *3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
 */
@WebFilter(filterName = "suFilter",urlPatterns = "/api/v2/suning/*")
@Configuration
public class suFilter implements Filter{

    private Logger logger=LoggerFactory.getLogger(suFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("suFilter is init+>>>>>");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        logger.info("doFilter is start+>>>>");
        HttpServletRequest request = ((HttpServletRequest) servletRequest);
        String requestURI = request.getRequestURI();
        logger.info("requestURI is " + requestURI);
        //调用该方法后,表示过滤器经过原来的url请求处理方法
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        logger.info("suFilter is destroy+>>>>>");
    }
}
···
WebFilter主要参数
| 参数 |类型 | 功能 | 
| - | :-: | :-: | 
| description | String| Filter的简单描述 | 
| displayName | String | Filter的显示名称 | 
| initParams | String[] | Filter的初始化参数 |
| filterName | String | Filter的名称 |
| servletNames | String[] | 使用该Filter的Servlet的名称 |
| urlPatterns | String[] | 使用该Filter的路径URL |
| dispatcherTypes | DispatcherType | 使用该Filter的模式 |
| asyncSupported | boolean | 是否支持异步 |

你可能感兴趣的:(SptingBoot,实战)