DNS二級域名自動跳轉 代替新網的跳轉功能

heming96發表於2008-07-26

新網的DNS跳轉功能很差幾乎每週都會停一段時間,公司決定自己做DNS二級域名跳轉,開始他們想用apache的rewrite功能來實現。可是二級域名跟要跳轉過去的地址幾乎沒有相關性,我想起以前做的透過域名實現子目錄跳轉的功能,但是需要使用動態配置,不重起伺服器實時生效,於是修改成下面的程式碼,使用listener每一分鐘讀取資料庫裡面的資料到HashMap裡面。

[@more@]

維護DNS轉發HashMap的Servlet
InitDnsServlet.java
public class InitDnsServlet extends HttpServlet implements Serializable
{
private static Logger log = Logger.getLogger(InitDnsServlet.class);
protected static HashMap dnsMap = null;
public void init()
{
try
{
InitDnsMap();
} catch (Exception e)
{
e.printStackTrace(System.out);
}
}
synchronized private static void InitDnsMap()
{
HashMap tmpDnsMap = null;
tmpDnsMap=new HashMap();
Vector vResult = null;
Hashtable table = null;
Connection con = null;
PreparedStatement past = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("Oracle jdbc:oracle:thin:@192.168.0.18:1521:orcl","user","pwd");
past = con.prepareStatement("select * from tbl_dns_redirectinfo where drin_state=1");
rs = past.executeQuery();
if(rs!=null) {
while(rs.next()) {
tmpDnsMap.put(rs.getString(1),rs.getString(2));
log.info(rs.getString(1) +" 轉向 "+ rs.getString(2));
}
}
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
try {
rs.close();
past.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
dnsMap=tmpDnsMap;
}
synchronized public static void reloadDnsMap() {
InitDnsMap();
}
synchronized public static HashMap getDnsMap() {
if(dnsMap == null)
{
try {
InitDnsMap();
} catch (Exception e) {
e.printStackTrace();
}
}
return dnsMap;
}
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
{}
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)throws ServletException, IOException
{}
}
監聽程式DNSListener.java 每1分鐘重新整理一下HashMap
import java.util.Timer;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class DNSListener implements ServletContextListener {
private java.util.Timer timer = new Timer(true);
public void contextInitialized(ServletContextEvent sce) {
try {

//log.info(dt.formateDate(d) + "*****");
//timer.schedule(new BalanceTimer(), new Date(), 24 * 3600 * 1000);

//服務啟動時間的第二天凌晨00:00:01秒執行
java.util.Timer timer= new Timer(true);
timer.schedule(new DnsTimer(), 0, 60*1000);//每1分鐘模擬請求一次

} catch (Exception e) {
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
}
TimerTask.java
import java.util.TimerTask;
import com.netqin.dba.dbtools.InitDnsServlet;
public class DnsTimer extends TimerTask {
public void run() {
InitDnsServlet.reloadDnsMap();
}
}
jsp 或servlet 實現跳轉:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.HashMap,java.sql.*,com.hem.dba.dbtools.InitDnsServlet" %>
<%
try
{
String dns=request.getRequestURL().toString();
out.println(dns);
dns=dns.toLowerCase();
int i=dns.indexOf(":",7);
if(i<0){i=120;}
int j=dns.indexOf("/",7);
if(i<j) j=i;
HashMap dnsMap=InitDnsServlet.getDnsMap();
if(dnsMap.get(dns.substring(7,j))!=null){
response.sendRedirect("));
}else{
out.println("不能解析的域名");
}
}
catch (Exception ex)
{
%><%= ex.toString() %><%
}
%>
資料庫:
tbl_dns_redirectinfo
drin_dns drin_newurl state
adm.hem.cn heming96.itpub.net/admin.php?re=no 1
這樣只要 adm.hem.cn 的ip地址指向我的服務,伺服器就會自動跳轉了,不過這要求adm.hem.cn 後面不能有別的比如埠、其他uri ,如果要的話需要特殊處理 比如把 uri獲取出來之response.sendRedirect(")));

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9614263/viewspace-1007868/,如需轉載,請註明出處,否則將追究法律責任。

相關文章