java基于正则表达式的域名处理



package apps.site3618.ext.childDomian.filter;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
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 shield.sysadm.database.InitAction;
import shield.tag.DomainUserInfo;
import shield.tag.SubSiteUserInfo;
import shield.tools.DatabaseTool;
import shield.tools.PracticalUtil;


/*
 * 企业子域名服务器
 *
 * 过滤器
 *
 * 解决360 sogou 产品四级域名问题
 *
 * 应用范围:全站
 *
 *  功能说明:
 *  
 * 发现四级域名即跳到404页面.
 *
 *
 *  apps.site3618.ext.childDomian.filter.EnterpriseChildDomainServiceFilter
 *  
 *  
 *  
 *  
 */


public class EnterpriseChildDomainServiceFilter implements Filter{
    
    
         String domain = "";
         int member_basic_issubsite=0;      
      
         /*
          * 分析请求的URL,将四级域名跳到404页面
          *
          */
         
        public int errorDomainParse(ServletRequest req, ServletResponse res){
                
              //System.out.println("子域名过滤.");
              
            HttpServletRequest request = (HttpServletRequest)req;
            HttpServletResponse response = (HttpServletResponse)res;
            HttpSession session = request.getSession();
            
            
            String requestDomain = "";
            String requestURI = "";
            String specialURL = "";
            int port = request.getServerPort();
            String servletPort = "";
            
            if ((port != 80) && (port > 0))
            {
              servletPort = ":" + Integer.toString(port);
            }
            
            
            try
            {
                
              this.domain = getDomainName(request);
              
              requestURI = request.getRequestURI();
              
              requestDomain = this.domain;
              
              //System.out.print("query specialURL:"+requestDomain);
              
              //中文域名
              
              /*
              specialURL = getUrlPathByURL(requestDomain);
              
              if ((specialURL != null) && (!"".equals(specialURL))) {
                  //System.out.print("Check Domain type:specialURL");
                requestDomain = specialURL;
              }
              */
                 // //System.out.print("Check Domain type: other");
              
              
                List list = null;
                
                //三级域名
                if ((!requestDomain.endsWith(".kenfor.com")) &&
                  (!requestDomain.startsWith("www.")) &&
                  ((list = matchSubsite(requestDomain)) != null))
                {
                    
                    /*
                        
                  if (isSpecialDomain(requestDomain))
                  {
                    loadUserInfo(session, requestDomain, true);
                    return 0;
                  }
                  */
                  
                  String memberAccount = (String)list.get(0);
                  String topDomain = (String)list.get(1);
                }
                //aabbcc.com www.3618med.com 或  //www.yuexin.aabbcc.com 四位域名  
                else
                {
                    //合法通过域名 www    
                    
                    if(requestDomain.equals("www.aabbcc.com")==true
                            || requestDomain.equals("aabbcc.com")==true    
                        ){
                            
                             //System.out.println("三级域名.www");
                            
                        }else{
                            
                            
                             //System.out.println("四级子域名."+requestDomain);
                            // loadUserInfo(session, requestDomain, true);
                     
                       
                                     return -1;
                        }
                    
                  
                }
           
            }
            catch (Exception ex)
            {
              try
              {
                  //System.out.println("系统异常,转向首页.");
                  
                response.sendRedirect("http://www.aabbcc.com");
              } catch (IOException e) {
                e.printStackTrace();
              }
              
                  //return 0;

            }

            
          // //System.out.println("跳转处理结果,正常访问:"+requestDomain);
          
            return 1;
        }
        
        
    


    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        
        
        int rs= errorDomainParse( request,  response);

            if(rs==-1){
                //System.out.println("发现有异常子域名.");
                
                HttpServletResponse res=(HttpServletResponse)response;
                
                //404
                //     String location="/apps/info/404_satate.jsp";
                  
                String url="http://www.aabbcc.com/apps/info/404_satate.jsp";
                //"http://www.aabbcc.com/Unknown.html"
                res.sendRedirect(url);
               
                          response.flushBuffer();
                          
                          return ;
            }
        
        
        try {
            chain.doFilter(request, response);
        } finally {
            response.flushBuffer();
            
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        
    }
    
    
      private String getUrlPathByURL(String url) {
            String urlStr = "";
            String sql = "select url_path from special_url where special_url like '%" + url + "%'";
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rSet = null;
            try {
              conn = InitAction.getConnection();
              pstmt = conn.prepareStatement(sql);
              rSet = pstmt.executeQuery();
              while (rSet.next())
                urlStr = rSet.getString("url_path");
            }
            catch (Exception e) {
            //  this.log.error(e.getMessage());
            }
            finally
            {
              DatabaseTool.closeConn(conn);
            }
            return urlStr;
          }
              
      //判断是否 special_domain
      
          private boolean isSpecialDomain(String subDomainName) {
            String sql =
              "select top 1 special_domain_id from special_domain where special_domain_name=?";
            Connection conn = null;
            boolean isSpecialDomain = false;
            try
            {
              conn = InitAction.getConnection();
              PreparedStatement stmt = null;
              ResultSet rs = null;
              stmt = conn.prepareStatement(sql);
              stmt.setObject(1, subDomainName);
              rs = stmt.executeQuery();
              if (rs.next())
              {
                isSpecialDomain = true;
              }
            }
            catch (SQLException sqle)
            {
             // this.log.error(sqle.getMessage());
            }
            finally
            {
              DatabaseTool.closeConn(conn);
            }
            return isSpecialDomain;
          }
          
          
          //三级域名正则表达式
      public String matchWapSite(String requestDomain)
      {
        String matchWap =
          "^wap\\.([a-zA-Z0-9\\-]+\\.(?:com|net|org|cn|cc|info|biz|com\\.cn|org\\.cn|net\\.cn))$";

        Pattern p = Pattern.compile(matchWap);
        Matcher m = p.matcher(requestDomain);
        String topDomain = null;
        if (m.find())
        {
          topDomain = m.group(1);
        }

        return topDomain;
      }
      
     /*
       * 提取域名 : 正则
       */

      public List matchSubsite(String requestDomain)
      {
          
        String topDomain = "";
        
        //后缀
        String matchDomainSuffix =
          "(\\.(?:com|net|org|cn|cc|info|biz|com\\.cn|org\\.cn|net\\.cn))$";
        
        //前缀
        String matchDomainPrefix = "^([a-zA-Z0-9\\-]+)\\.([a-zA-Z0-9\\-]+)";
        
        
        Pattern p = Pattern.compile(matchDomainSuffix);
        
        
        Matcher m = p.matcher(requestDomain);
        
        ArrayList list = null;
        
        String domainSubffix = "";
        String domainPrefix = "";
        
        if (m.find())
        {
            
            //截取字符 清理.com .com.cn
          domainSubffix = m.group(1);

          domainPrefix = requestDomain.substring(0,
            requestDomain.indexOf(
            domainSubffix));
          
          //二次处理 提取 www domain 主域名,子域名
          Pattern p2 = Pattern.compile(matchDomainPrefix);
          
          Matcher m2 = p2.matcher(domainPrefix);
          
          if (m2.find())
          {
            list = new ArrayList();
            list.add(m2.group(1));
            list.add(m2.group(2));
          }

          if ((list != null) && (list.size() == 2))
          {
            topDomain = (String)list.get(1) + domainSubffix;
            list.set(1, topDomain);
          }
        }
        
        
        

        return list;
        
        
      }


      public String getDomainName(HttpServletRequest request)
        throws MalformedURLException
      {
        URL url = null;

        String tmpUrlStr = request.getRequestURL().toString();
        url = new URL(tmpUrlStr);

        return url.getHost();
      }
      
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub

        }

}


    //性能测试
            
            EnterpriseChildDomainServiceFilter ef=new EnterpriseChildDomainServiceFilter();
            
            String requestDomain="www.aabbcc.com";
            
            long t1=System.currentTimeMillis();
            
            int c=1000000;
            for(int i=0;i<c;i++){
                
            List list=    ef.matchSubsite(requestDomain);
                
            //    System.out.println(list.get(0));
                //System.out.println(list.get(1));
                
            }
        
            long t2=System.currentTimeMillis();
            
            
            java.text.SimpleDateFormat ft=new java.text.SimpleDateFormat("hh:mm:ss SSS");
            
            System.out.println(" t1:"+ft.format(new java.util.Date(t1)));
            
            System.out.println(" t2:"+ft.format(new java.util.Date(t2)));
            
            
            System.out.println(" avg:"+ ( (double)(t2-t1)/c) );

测试结果:

 t1:11:23:41 390
 t2:11:23:48 671
 avg:0.007281






Java基于正则表达式提供了强大的文本查找和匹配功能。 正则表达式是一种用于描述文本模式的字符串。在Java中,使用java.util.regex包提供的正则表达式类来处理文本的匹配和查找。 首先,我们可以使用Pattern类来创建一个正则表达式模式对象。我们可以使用各种元字符和特殊符号来定义我们要查找的模式。例如,我们可以使用`.`匹配任意字符,`*`匹配前面的字符的零个或多个实例,`+`匹配一个或多个实例,`?`匹配零个或一个实例,`[]`匹配括号内的任何字符,`{}`匹配前面的字符的指定实例数等等。 接下来,我们使用Matcher类来对给定的输入文本进行匹配。我们使用Pattern对象的matcher()方法来创建一个Matcher对象,并以输入文本作为参数传入。然后,我们可以使用Matcher对象提供的各种方法来查找匹配的文本。 例如,我们可以使用matches()方法来检查整个输入文本是否与正则表达式完全匹配。使用find()方法来查找下一个符合正则表达式的子串,并使用group()方法来获取匹配的文本。我们还可以使用replaceFirst()和replaceAll()方法来替换匹配的文本。 Java正则表达式功能非常强大和灵活,可以应用于各种文本处理场景。无论是验证用户输入、提取特定格式的数据、替换文本、切割字符串等等,正则表达式都提供了一种高效、方便的方式来处理这些任务。同时,Java提供的正则表达式类库也提供了丰富的API和方法来满足各种需求。 总的来说,Java基于正则表达式提供了强大的查找匹配的文本功能,使得任务变得简单和高效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值