<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    子在川上曰

      逝者如斯夫不舍晝夜
    隨筆 - 71, 文章 - 0, 評(píng)論 - 915, 引用 - 0
    數(shù)據(jù)加載中……

    二級(jí)域名的java實(shí)現(xiàn)

    最近在做一個(gè)自建網(wǎng)站平臺(tái)(http://www.yowob.com ),其他涉及到為用戶提供一個(gè)二級(jí)域名功能,實(shí)現(xiàn)方法如下:

    (1)首先要在域名服務(wù)商端做一個(gè)泛域名解析. 我用的是godaddy.com,就新建一個(gè)A記錄(host=*,point to指向我的服務(wù)器的ip),這樣所有二級(jí)域名都會(huì)轉(zhuǎn)到我的服務(wù)器來(lái)了

    (2)接著在web.xml配一個(gè)自已寫(xiě)的域名過(guò)濾器,

        <filter>
            <filter-name>URLFilter</filter-name>
            <filter-class>com.yowob.commons.URLFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>URLFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    過(guò)濾器的代碼如下。這里先將二級(jí)域名和全球域名和用戶ID的映射,保存在一個(gè)數(shù)據(jù)表里, 然后訪問(wèn)進(jìn)來(lái)時(shí)對(duì)地址做一個(gè)判斷, 再取出對(duì)應(yīng)的用戶ID. 再轉(zhuǎn)一下就行了. 我的靜態(tài)文件都在static目錄,所以還加了一個(gè)static的判斷。
    比如: http://time.you.com/board/21 用time對(duì)應(yīng)用戶ID為6,則訪問(wèn)效果有 http://www.you.com/6/board/21相同, 不過(guò)地址欄還是顯示http://time.you.com/board/21
    再比如:htttp://www.userdomain.com/board/21,這個(gè)是用戶ID為6的全球域名,訪問(wèn)效果也和上面一樣。

    package com.yowob.commons;

    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    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 javax.servlet.http.HttpServletRequest;

    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.lang.math.NumberUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import com.yowob.Constants;
    import com.yowob.dao.SiteDAO;
    import com.yowob.dto.SiteDTO;

    public class URLFilter implements Filter {
        
    private static final Log log = LogFactory.getLog(URLFilter.class);
        
    private static final String DOMAIN_END = "." + Constants.DOMAIN; //.you.com
        private static final Map<String, Long> NAME_MAP = new HashMap<String, Long>();
        
    private static final Map<String, Long> DOMAIN_MAP = new HashMap<String, Long>();

        @Override
        
    public void init(FilterConfig filterConfig) throws ServletException {
            log.info(
    "------------------------------init");
            SiteDAO siteDAO 
    = new SiteDAO();
            List
    <SiteDTO> list = siteDAO.getAll();
            
    for (SiteDTO siteDTO : list) {
                String name 
    = siteDTO.getName();
                
    if (StringUtils.isNotEmpty(name)) {
                    NAME_MAP.put(name, siteDTO.getId());
                }
                String domain 
    = siteDTO.getDomain();
                
    if (StringUtils.isNotEmpty(domain)) {
                    DOMAIN_MAP.put(domain, siteDTO.getId());
                }
            }
        }

        
    public static void updateName(String oldValue, String newValue, Long siteId) {
            
    if (StringUtils.equals(oldValue, newValue)) {
                
    return;
            }
            
    if (StringUtils.isNotEmpty(oldValue)) {
                NAME_MAP.remove(oldValue);
            }
            
    if (StringUtils.isNotEmpty(newValue)) {
                NAME_MAP.put(newValue, siteId);
            }
        }

        
    public static void updateDomain(String oldValue, String newValue, Long siteId) {
            
    if (StringUtils.equals(oldValue, newValue)) {
                
    return;
            }
            
    if (StringUtils.isNotEmpty(oldValue)) {
                DOMAIN_MAP.remove(oldValue);
            }
            
    if (StringUtils.isNotEmpty(newValue)) {
                DOMAIN_MAP.put(newValue, siteId);
            }
        }

        @Override
        
    public void destroy() {
            log.info(
    "------------------------------destroy");
        }

        @Override
        
    public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request 
    = (HttpServletRequest) servletRequest;
            String requestURI 
    = request.getRequestURI();
            String serverName 
    = request.getServerName().toLowerCase();
            String realURI 
    = getRealRequestURI(serverName, requestURI);
            request.getRequestDispatcher(realURI).forward(request, response);
        }

        
    private String getRealRequestURI(String serverName, String requestURI) {
            
    if (Constants.WWW_DOMAIN.equals(serverName) || requestURI.startsWith("/static/"|| Constants.DOMAIN.equals(serverName)) {
                
    return requestURI;
            }
            
    if (serverName.endsWith(DOMAIN_END)) {
                String secondDomain 
    = serverName.substring(0, serverName.indexOf("."));
                
    //網(wǎng)站id
                if (NumberUtils.isNumber(secondDomain))
                    
    return getURI(secondDomain, requestURI);
                
    //網(wǎng)站英文名
                Long siteId = NAME_MAP.get(secondDomain);
                
    if (siteId == null) {
                    
    //保留的二級(jí)域名
                    if (Constants.isPrivateSecondDomain(secondDomain)) {
                        
    return requestURI;
                    }
                    
    return "/message?msg=不存在二級(jí)域名" + secondDomain;
                    
    //                throw new RuntimeException("do not exist second domain: " + secondDomain);
                }
                
    return getURI(siteId + "", requestURI);
            }
            
    //域名
            Long siteId = DOMAIN_MAP.get(serverName);
            
    if (siteId == null) {
                
    return requestURI;
            } 
    else {
                
    return getURI(siteId + "", requestURI);
            }
        }

        
    private static String getURI(String siteId, String requestURI) {
            
    if (requestURI.equals("/")) {
                
    return "/" + siteId;
            } 
    else {
                
    return "/" + siteId + requestURI;
            }
        }

    }


    其他一些小技巧:
    (1)為了便于本機(jī)測(cè)試,可以修改windows 的hosts文件。我的如下:
    127.0.0.1       localhost
    127.0.0.1       you.com
    127.0.0.1       www.you.com
    127.0.0.1       time1.you.com
    127.0.0.1       time2.you.com
    127.0.0.1       6.you.com
    127.0.0.1       www.bobo.com

    (2)web頁(yè)的各種地址則要注意相對(duì)路徑的問(wèn)題。主要考慮
    首先設(shè)置<base />,或<base />其中地址最后要加一個(gè)/
    然后頁(yè)面中其他地址前面不加/,就是相對(duì)地址(以地址欄為基礎(chǔ))。加上/,則是絕對(duì)地址。

    posted on 2010-12-29 23:19 陳剛 閱讀(8263) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 成人免费激情视频| 亚洲AV无码一区二区三区牛牛| 午夜两性色视频免费网站| 无码国产精品一区二区免费式芒果 | 亚洲中文字幕无码久久精品1| 毛色毛片免费观看| 无码国产精品一区二区免费模式 | 亚洲精品国产成人影院| 亚洲国产日产无码精品| 国产亚洲一区二区手机在线观看| 国产一区二区三区免费在线观看| 免费人成视频在线| 免费精品国产日韩热久久| 日韩电影免费在线观看网址| 亚洲国产精品久久久久网站| 久久精品国产精品亚洲艾草网美妙| 国产网站在线免费观看| 免费A级毛片av无码| 拍拍拍无挡免费视频网站| 国产福利在线观看永久免费| 国产天堂亚洲国产碰碰| 亚洲AV无码一区二区三区性色| 中文文字幕文字幕亚洲色| 亚洲午夜电影在线观看高清| 亚洲综合小说久久另类区| 老色鬼久久亚洲AV综合| 久久夜色精品国产噜噜亚洲AV| 亚洲国产三级在线观看| 国产gv天堂亚洲国产gv刚刚碰| 久久99亚洲综合精品首页| AV在线播放日韩亚洲欧| 相泽亚洲一区中文字幕| 亚洲中久无码永久在线观看同| 一本久久a久久精品亚洲| 国产午夜亚洲不卡| 亚洲精品乱码久久久久66| 国产亚洲成AV人片在线观黄桃| 亚洲av无码一区二区三区不卡 | 免费国产黄网站在线看| 欧洲精品码一区二区三区免费看| 黄色a三级三级三级免费看|