WebFilter过滤器,返回指定信息

简介: WebFilter过滤器,返回指定信息

import java.io.IOException;
import java.util.HashSet;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

@ConditionalOnProperty(prefix="test.ip.filter",name="ip",havingValue="true",matchIfMissing=false)
@WebFilter(filterName = "IpFilter", urlPatterns = {"/api/","/api2/"})
public class IPFilter implements Filter {


@Value("${query.filter.ipadress:}")
private String ips;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
    boolean needFilter = false;

    String paramNames = ((HttpServletRequest) servletRequest).getParameter("paramNames");
    String[] targetNames = new String[]{"","",""}for(String t:targetNames){
       if(t.equals(name)){
                needFilter = true;
                break;
            }
        }
    }
    if(!needFilter){
        filterChain.doFilter(servletRequest, servletResponse);
    }else{
        
        String ip = getIpAddress((HttpServletRequest) servletRequest);
        HashSet<String> ipSet = getIpList(ips);
        logger.debug("配置的过滤ip列表为:{},请求ip为:{},是否包含:{}",ips,ip,ipSet.contains(ip));
        if(ipSet.contains(ip)) {
            logger.warn("来自ip={}的请求任务,返回空值",ip);
            sendSometing("",servletResponse);
            return;
        }else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        
    }
}

@Override
public void destroy() {

}

public HashSet<String> getIpList(String ips){
    HashSet<String> set = new HashSet<>();
    String[] ipaddres = ips.split(",");
    for (String ipaddr : ipaddres) {
        if(ipaddr.contains("-")) {
            String[] ipt = ipaddr.split("-");
            int start = Integer.valueOf(ipt[0].substring(ipt[0].lastIndexOf(".") + 1));
            int end = Integer.valueOf(ipt[1]);
            for (int i = start; i <= end; i++) {
                set.add(ipt[0].substring(0,ipt[0].lastIndexOf(".") + 1)+ i);
            }
        }else {
            set.add(ipaddr);
        }
    }
    return set;
}

public void sendSometing(String reason, ServletResponse servletResponse) throws IOException {
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("text/plain; charset=UTF-8");
    response.getWriter().write(reason);
}

// 获取ip
public static String getIpAddress(HttpServletRequest request) {
    String ip = null;
    // X-Forwarded-For:Squid 服务代理
    String ipAddresses = request.getHeader("X-Forwarded-For");
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
        // Proxy-Client-IP:apache 服务代理
        ipAddresses = request.getHeader("Proxy-Client-IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
        // WL-Proxy-Client-IP:weblogic 服务代理
        ipAddresses = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
        // HTTP_CLIENT_IP:有些代理服务器
        ipAddresses = request.getHeader("HTTP_CLIENT_IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
        // X-Real-IP:nginx服务代理
        ipAddresses = request.getHeader("X-Real-IP");
    }
    // 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
    if (ipAddresses != null && ipAddresses.length() != 0) {
        ip = ipAddresses.split(",")[0];
    }
    // 还是不能获取到,最后再通过request.getRemoteAddr();获取
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
        ip = request.getRemoteAddr();
    }
    return ip;
}





public static void main(String[] args) {
    String ips = "172.10.1.210,172.10.10.220-225";
    HashSet<String> set = new HashSet<>();
    String[] ipaddres = ips.split(",");
    System.out.println(ipaddres[0]+"="+ipaddres[1]);
    for (String ipaddr : ipaddres) {
        if(ipaddr.contains("-")) {
            String[] ipt = ipaddr.split("-");
            int start = Integer.valueOf(ipt[0].substring(ipt[0].lastIndexOf(".") + 1));
            int end = Integer.valueOf(ipt[1]);
            for (int i = start; i <= end; i++) {
                set.add(ipt[0].substring(0,ipt[0].lastIndexOf(".") + 1)+ i);
            }
        }else {
            set.add(ipaddr);
        }
    }
    System.out.println(set.toString());
}

}

相关文章
|
测试技术 C语言 Perl
内存优化-使用tcmalloc分析解决内存泄漏和内存暴涨问题
其实我一直很想写关于tcmalloc的内存泄漏检测的文章,只是一直记不起来该如何下笔,有时项目太忙,在整理这方便的思考过少,另外遇到的问题也不是很多,直到最近用tcmalloc帮A项目排查...
|
存储 算法 C语言
【数据结构】树的基础知识及三种存储结构
文章目录 一、树的概念与定义 二、树的有关名词 三、树的存储结构 1.双亲表示法 2.孩子表示法 3.孩子兄弟表示法(又叫二叉树法) 四、树的应用
|
SQL NoSQL MongoDB
『MongoDB』MongoDB聚合框架深度解析及丰富的聚合查询案例
📣读完这篇文章里你能收获到 - MongoDB聚合框架的概念知识 - MongoDB的复杂聚合查询 - MQL与SQL的对比 - MQL聚合查询转换成相应语言的代码
1122 1
『MongoDB』MongoDB聚合框架深度解析及丰富的聚合查询案例
|
8月前
|
JavaScript 前端开发
在Node.js中,如何合理使用模块来避免全局变量的问题?
在Node.js中,如何合理使用模块来避免全局变量的问题?
323 71
|
11月前
|
机器学习/深度学习 编解码 自动驾驶
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
483 3
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
9月前
|
数据采集 人工智能 Java
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
DevDocs是一款基于智能爬虫技术的开源工具,支持1-5层深度网站结构解析,能将技术文档处理时间从数周缩短至几小时,并提供Markdown/JSON格式输出与AI工具无缝集成。
444 1
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
|
数据处理 计算机视觉 索引
NumPy中的布尔索引与花式索引详解
【4月更文挑战第17天】本文介绍了NumPy中的布尔索引和花式索引,这两种高级索引方式增强了数组操作的灵活性。布尔索引利用布尔数组过滤数据,如`array[bool_array]`用于根据条件筛选元素;在数据分析中,这对条件筛选非常有用。花式索引包括切片、数组和元组索引,允许非整数位置访问元素。例如,数组索引`array[index_array]`按指定位置选取元素,元组索引适用于多维数组的选择。掌握这两种索引能提升数组数据处理的效率。
|
安全 Java
unsafe类和varhandle类讲解
本文介绍了Java中的Unsafe类和VarHandle类,展示了Unsafe类如何通过底层操作绕过Java的安全限制直接访问内存和对象,以及VarHandle类如何在Java 9及以上版本中提供原子性和可变性访问。
306 1
unsafe类和varhandle类讲解
|
前端开发 关系型数据库 数据库
Django 后端架构开发:虚拟环境管理到项目搭建
Django 后端架构开发:虚拟环境管理到项目搭建
342 1