JAVA:Filer过滤器+案例:请求IP访问限制和请求返回值修改

JAVA:Filer过滤器

介绍

Java中的Filter也被称为过滤器,它是Servlet技术的一部分,用于在web服务器上拦截请求和响应,以检查或转换其内容。
Filter的urlPatterns可以过滤特定地址http的请求,也可以利用Filter对访问请求的数据IP做限制。
文档为本人学习java过滤器过程中做的学习记录。

主要用途:

  • 认证过滤:检查用户请求并确定是否合法。
  • 登记日志:记录请求和响应的日志。
  • 改变请求和响应:可以修改请求头和响应头。
  • 数据压缩:在发送大数据前,可以压缩数据。
  • 加密:对请求和响应进行加密和解密。

使用说明

Spring项目中,创建类继承Filter,实现init、doFilter、destroy方法;

  • init:只在项目启动的时候运行,用来做数据的初始化
  • doFilter:数据过滤,每次http请求都会过滤;filterChain.doFilter(request, servletResponse)前面的程序程序是在执行目标程序前执行,后面的程序是在目标程序后执行,若doFilter程序没有执行filterChain.doFilter,请求将会被拦截。
  • destroy:项目结束时运行

多个过滤器执行顺序

注意:SpringBoot项目中,多个过滤器时,@Order + @WebFilter + @ServletComponentScan 是无法实现按顺序执行过滤器的,推荐使用FilterRegistrationBean实现过滤器按照顺序执行。

  • 原因详细分析见:https://blog.youkuaiyun.com/Zong_0915/article/details/126747302

案例(使用FilterRegistrationBean限制过滤器执行循序+限制IP+修改请求返回值)

案例:有两个过滤器:MyFilter01和MyFilter02,要求按先执行过滤器MyFilter01,再执行过滤器MyFilter02顺序。
MyFilter01实现对IP的白名单限制(限制127.0.0.1仅可以访问一次),以及请求返回值的更写。
MyFilter02仅用于体现执行顺序。

  • 案例参考地址:
    https://blog.youkuaiyun.com/zhanwuguo8346/article/details/120498756

创建过滤器:MyFilter01用于限制访问IP,修改请求返回值;


@Slf4j
public class MyFilter01 implements Filter {
   
   

    private Map<String, Integer> whiteIPMap;

    private List<String> alwaysIPList;

    public MyFilter01(Map<String, Integer> whiteIPMap, List<String> alwaysIPList) {
   
   
        this.alwaysIPList = alwaysIPList;
        this.whiteIPMap = whiteIPMap;
    }

    private final ObjectMapper objectMapper = new ObjectMapper();

    private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("/swagger-resources", "/v3/swagger-login", "/v2/api-docs")));

    private static Map<String, Integer> whiteIpMapDay = new HashMap<>();


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
   
        System.out.println("(MyFilter01)项目开始时候执行:------->>>init");
        System.out.println("(MyFilter01)whiteIPMap:" + whiteIPMap);
        System.out.println("(MyFilter01)alwaysIPList:" + alwaysIPList);
        whiteIpMapDay.putAll(whiteIPMap);

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
   
        System.out.println("(MyFilter01)项目每次http请求时候执行:------->>>doFilter.start");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String ipAddr = getIpAddr(request);
        log.info("PermissionFilter 过滤器,请求ip为:{}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值