DNS二級域名自動跳轉 代替新網的跳轉功能
新網的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- xshell-ssh自動多級跳轉功能介紹
- 自己做二級域名的DNS (轉)DNS
- 域名怎樣跳轉防封 微信域名跳轉防封技術揭秘
- 阻止a標籤的跳轉,a標籤自動跳轉引起的錯誤
- SecureCRT - 自動登入跳轉Securecrt
- jsp自動跳轉的幾種方法JS
- 線路分流自動跳轉程式碼
- 微信域名檢測、防封,微信跳轉技術揭秘(二)
- react跳轉url,跳轉外鏈,新頁面開啟頁面React
- 轉跳
- Kotlin-優雅的完成登入判斷及自動跳轉功能Kotlin
- 網站劫持跳轉,分享網站被劫持跳轉的解決辦法網站
- Activity 不只有跳轉。功能篇(一)
- 如何設定HTTP自動跳轉到HTTPSHTTP
- NFC 標籤:自動跳轉到指定應用
- JS 跳轉JS
- Activity跳轉
- MFC登入介面,跳轉到功能介面
- url跳轉的兩種實現方式 域名 80埠占用
- 微信域名防封跳轉系統的原理,微信域名防封的注意點
- PHP頁面跳轉如何實現延時跳轉PHP
- MRS升級跳轉註意事項
- java 跳轉語句(轉)Java
- 【ionic】介面跳轉
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- 微信小遊戲之跳一跳-電腦自動跳躍遊戲
- 小程式間跳轉最新功能調整
- Fragment跳轉的騷操作Fragment
- activity之間的跳轉
- MySQL的跳脫字元“” (轉)MySql字元
- 微信內分享域名防紅方案-微信域名防封跳轉技術的方案解析
- 微信域名檢測、防封,微信跳轉技術揭秘(一)
- 問題解決:下載的網頁開啟後自動跳轉到首頁網頁
- iOS開發程式之間的跳轉及跳轉到appStoreiOSAPP
- js跳轉頁面方法(轉)JS
- 微信跳轉_跳轉微信原理 weixin://dl/business/?ticket=xxx
- 客戶端跳轉技術,服務端跳轉技術,兩種跳轉的各自使用場合和特點客戶端服務端
- js實現操作成功之後自動跳轉頁面JS