`

java --IP地址段的过滤

    博客分类:
  • java
阅读更多

IP地址段的过滤
        昨天接到领导指示,要对地市的IP地址进行过滤,晕了,过滤啥呀,不过想归想,那还得做不是,呵呵
开始想在服务器<Tomcat>上整一下呢,仔细一看不行,附Tomcat过滤IP方法:
限制ip,限制主机访问:
如果想禁止指定的ip或者主机名来拒绝某些机器访问,或者指定某些机器来访问。
也支持分别按Engine, Host, or Context,进行以下配置:
<Context path="/examples" ...> ...
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow="*.mycompany.com,www.yourcompany.com"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192.168.1.*"/>
</Context>
参考:
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/context.html
没辙,继续...
因为要过滤的IP有七十二组<(58.87.96.0    58.57.121.255),(219.147.0.0    219.147.0.211)>想到用正则表达式,因为本人对正则表达式这东西,实在不精,呵呵,也就没敢用,呵呵
最终在于朋友交流后,采取如下形式解决的:

一、新建一xml配置文件,将要过滤的IP段写入;
二、新建一Filter,完成过滤要求
代码如下所示:
IP.XML
<?xml version="1.0" encoding="UTF-8"?>
<root id="allow">
   <group>    
    <start>122.6.192.0</start>
    <end>122.6.255.255</end>
   </group>
   <group>    
    <start>219.146.208.0</start>
    <end>219.146.215.255</end>
   </group>
   <group>    
    <start>222.174.224.0</start>
    <end>222.174.255.255</end>
   </group>
</root>
Filter如下所示:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.*;


public class FilterServlet    extends HttpServlet    implements Filter {
  

  private Document doc=null;
  private FilterConfig filterConfig;
  //Handle the passed-in FilterConfig
  private String encoding = "GBK";
  
  public void init(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
  }

  //Process the request/response pair
  public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain filterChain) {
  
   HttpServletResponse httpResp = null;
   HttpServletRequest httpReq = null;

    try {

      String reqip = request.getRemoteHost();
      if(null != reqip){      
          reqip = reqip.replace('.','_');
      }
      String[] temp = reqip.split("_");
      int[] ip = new int[temp.length];
      
      for(int i=0;i<temp.length;i++){      
          ip[i] = new Integer(temp[i]).intValue();
      }
      if (response instanceof HttpServletResponse) {
      
       httpReq = (HttpServletRequest)request;
       httpResp = (HttpServletResponse)response;
      if(!viewXml(httpReq.getRealPath("/")+"/WEB-INF/ip.xml",ip)){
      
       httpResp.sendRedirect(" http://welcome.sd.vnet.cn/ ");
      }
      filterChain.doFilter(request, response);
    }
    }
    catch (ServletException sx) {
     filterConfig.getServletContext().log(sx.getMessage());
    }
    catch (IOException iox) {
      filterConfig.getServletContext().log(iox.getMessage());
    }catch(Exception e){
    
     filterConfig.getServletContext().log(e.getMessage());
    }
  }
  
  /**
   * 验证请求IP是否符合要求
   * @param xmlFile
   * @return
   * @throws Exception
   */
  public boolean viewXml(String xmlFile,int[] ip) throws Exception {
  
   int[] test = ip;
   boolean flag = true;
   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
   DocumentBuilder db=dbf.newDocumentBuilder();  
   doc=db.parse(new File(xmlFile));
   Element root = doc.getDocumentElement();
      NodeList list = root.getElementsByTagName("group");

      for (int i=0; i < list.getLength() ; i++) {
        Element element = (Element)list.item(i);
        NodeList titleid = element.getElementsByTagName("start");
        Element idElement = (Element)titleid.item(0);
        String ip1 = idElement.getFirstChild().getNodeValue();      
        ip1 = ip1.replace('.','_');
        String[] ip1s = ip1.trim().split("_");
        Integer[] ipl1 = new Integer[ip1s.length];
        for(int a=0;a<ip1s.length;a++){
                  ipl1[a] = new Integer(ip1s[a]);
        }
        
        NodeList titleList = element.getElementsByTagName("end");
        Element titleElement = (Element)titleList.item(0);
        String ip2 = titleElement.getFirstChild().getNodeValue();
        ip2 = ip2.replace('.','_');
        String[] ip2s = ip2.trim().split("_");
        Integer[] ipl2 = new Integer[ip2s.length];
        for(int b=0;b<ip2s.length;b++){        
            ipl2[b] = new Integer(ip2s[b]);
        }
        
        long test_value = test[0]*255*255*255+test[1]*255*255+test[2]*255+test[3];
        long ip1_value = ipl1[0]*255*255*255+ipl1[1]*255*255+ipl1[2]*255+ipl1[3];
        long ip2_value = ipl2[0]*255*255*255+ipl2[1]*255*255+ipl2[2]*255+ipl2[3];
        
        if(test_value >= ip1_value && test_value <= ip2_value){        
            return true;
        }
        
      }      
      return false;
  }

  public void destroy() {
    filterConfig = null;
    encoding = null;
  }
}
WEB.XML如下:
<filter>
  <filter-name>filterservlet</filter-name>
  <filter-class>com.lvke.web.qcbst.util.common.FilterServlet</filter-class>
</filter>
<filter-mapping>
   <filter-name>filterservlet</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

希望能给用到的朋友减少一下负担,呵呵

分享到:
评论

相关推荐

    java过滤IP地址代码

    String remoteHost=request.getRemoteHost(); log.info("Request from host:"+remoteHost); //判断客户计算机IP地址是否合法,以127开头的表示不合法,禁止访问

    word源码java-china-ip-filter:中国大陆IP过滤器-Java

    中国大陆IP过滤器-Java IP文件路径: 项目的resources/china_ip目录下 使用ChinaIPRecognizer类即可 更新记录 201911月30日更新 原文链接: 概述 本篇讲解如何快速判断IPV4地址是否在大陆境内的IP地址。 中国IPV4的...

    IP地址段的过滤,限制ip,限制主机访问

    如果想禁止指定的ip或者主机名来拒绝某些机器访问,或者指定某些机器来访问。

    Java实现IPV6地址查询

    Java实现IPV6地址查询 Java IP V6 ipv6 地域 地址 查询 地址查询 使用ZX公网IPv6库 20120916版

    ip地址管理器用java语言实现

    IP地址的过滤,开通和关闭 IP地址的过滤,开通和关闭 IP地址的过滤,开通和关闭

    jsp程序 用户IP地址所在地记录

    用户IP地址所在地记录,jsp程序 src\ipaddr IPEntry.java IPSeeker.java Test1.java Test.java Utils.java

    knx-core:KNX Core-用于KNX NetIP通信的Java库

    IP地址(可选,如果未提供,将使用自动发现服务) 路由:仅KNX路由器 您的KNX路由器设备上的过滤器表已正确配置,否则数据包将不会转发 KNX路由器使用的IP组播地址(可选,如果未提供,将使用默认的224.0.23.12组播...

    TCP-IP技术大全

    IPv6 87 10.1 IPv6数据报 87 10.1.1 优先级分类 88 10.1.2 流标识 89 10.1.3 128位IP地址 89 10.1.4 IP扩展头 90 10.2 多IP地址主机 91 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的...

    OpenSwing---Java 常用控件集合

    JIpAddressField IP地址输入框,只能输入0~255数字的IP地址 JListChooser 列表选择对话框 JNumberField 数字输入框,可限制小数位数,数字最大长度,最大最小能输入的数字 JPopupButton 带下拉菜单的工具栏按钮 ...

    JAVA上百实例源码以及开源项目

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    Java获取客户端的真实IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件不能获取到客户端的真实IP地址了。像移动网关一样,iisforward这个...

    JAVA上百实例源码以及开源项目源代码

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java开源包10

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包1

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包11

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包6

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包9

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包101

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics