我的Blog我做主^_^

          走向一條通往JAVA的不歸路...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            64 隨筆 :: 68 文章 :: 77 評論 :: 0 Trackbacks

          ??????? 昨天接到領導指示,要對地市的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>

          希望能給用到的朋友減少一下負擔,呵呵



          posted on 2007-03-23 14:48 java_蟈蟈 閱讀(1479) 評論(4)  編輯  收藏

          評論

          # re: IP地址段的過濾[未登錄] 2007-08-02 15:55 sky
          謝謝了,學習了,我也應用上了,真的感謝這位仁兄,不過上面的
          long test_value = test[0]*255*255*255,這個在 jdk 1.4會報錯,也就是說得配 jdk 1.5,才好一點  回復  更多評論
            

          # re: IP地址段的過濾 2007-09-24 15:25 coolala
          此處的.getRealPath("/")方法。。。。。  回復  更多評論
            

          # re: IP地址段的過濾 2007-11-23 11:09 小雨
          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];
          會不會有數據溢出問題啊
            回復  更多評論
            

          # re: IP地址段的過濾 2007-11-23 14:42 java_蟈蟈
          @小雨
          謝謝你的到來,應該不會產生數據溢出的問題^_^  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 佛冈县| 项城市| 丰宁| 大厂| 菏泽市| 桐梓县| 河曲县| 大安市| 偏关县| 包头市| 河北省| 重庆市| 昌平区| 阿拉尔市| 九寨沟县| 嘉善县| 长丰县| 景德镇市| 同江市| 历史| 潞西市| 菏泽市| 永登县| 阳高县| 全州县| 内丘县| 青冈县| 安阳县| 太保市| 上杭县| 陆丰市| 莎车县| 晋城| 辽宁省| 开江县| 汉源县| 安塞县| 锦屏县| 东源县| 湘潭市| 炎陵县|