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