您的位置:首页 > 编程语言 > Java开发

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

2015-06-24 11:21 573 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: