filter过滤器

1.简介

Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

2.功能

处理全站中文乱码问题

实现自动登录

过滤敏感词汇

压缩网页

选择性让浏览器缓存

3.filter 链

在web.xml中,我们知道,执行顺序是谁在前边执行谁。在spring boot中的FilterRegistrationBean注册过滤器的类中有个order属性。
这个order的默认值是Integer.MAX_VALUE 也就是int的最大值,spring boot 会按照order值的大小,从小到大的顺序来依次过滤。

4.spring boot配置filter

1)FilterRegistrationBean的方式

1、创建两个实现Filter接口的类filter1 、filter2

package com.lixin.study.filter;

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

public class filter1 implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("第一个过滤器创建");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("第一个过滤器执行");
    }

    @Override
    public void destroy() {
        System.out.println("第一个过滤器销毁");
    }
}
package com.lixin.study.filter;

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

public class filter2 implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("第二个过滤器创建");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("第二个过滤器执行");
    }

    @Override
    public void destroy() {
        System.out.println("第二个过滤器销毁");
    }
}

2、创建配置类      
有多个filter就创建多个FilterRegistrationBean ,若需注明filter的执行顺序,可通过registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置,值越大,执行顺序越靠后

package com.lixin.study.config;

import com.lixin.study.filter.filter1;
import com.lixin.study.filter.filter2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean companyUrlFilterRegister() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入过滤器
        registration.setFilter(new filter1());
        //拦截规则
        registration.addUrlPatterns("/*");
        //过滤器名称
        registration.setName("filter1");
        //过滤器顺序
        registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
        return registration;
    }

    @Bean
    public FilterRegistrationBean outLinkSecurityFilterRegister() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入过滤器
        registration.setFilter(new filter2());
        //拦截规则
        registration.addUrlPatterns("/*");
        //过滤器名称
        registration.setName("filter2");
        //过滤器顺序
        registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1);
        return registration;
    }
}

2)注解@WebFilter

1、在启动类上增加@ServletComponentScan注解,自动扫描带有过滤器注解的包      
2、在类上使用@WebFilter和@Order组合实现

package com.lixin.study.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.core.annotation.Order;

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

@WebFilter(filterName="filter3",urlPatterns= {"/*"})
@Order(FilterRegistrationBean.LOWEST_PRECEDENCE)
public class filter3 implements Filter{
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
      System.out.println("第三个过滤器创建");
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      filterChain.doFilter(servletRequest,servletResponse);
      System.out.println("第三个过滤器执行");
  }

  @Override
  public void destroy() {
      System.out.println("第三个过滤器销毁");
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值