Java 实现多个二级域名访问同一个Tomcat(系统)。

JSON 2016-08-22 17:40:31 15687

对于小成本站长,小公司,要实现多 二级域名  ,因为要多套环境,在成本上开销很大,并且麻烦复杂。还有一种需求,类似javablog,csdn、网易博客什么的,需要用用户来区分域名的。来看看怎么实现。

前面讲了:单个项目多个二级域名简单实现思路

建议没有看过的同学,先看下那篇博客。

二级域名的转换

比如我叫张三,我的个性化域名就是zhangsan.itnan.net 就可以这样。那他实际访问的地址是?

也不固定,看网站布局,可以是:

zhangsan.itnan.net ==> blog.itnan.net/blog.html?user=zhangsan

zhangsan.itnan.net ==> blog.itnan.net/blog/zhangsan

... ...

二级域名请求的实现

很多方式,下面我们来说实现吧。

首先我们确定思路,那么就是我们肯定要经过一个Filter,然后通过Filter去改变请求的地址,而这个Filter需要在我们的 DispatcherServlet之前,我这里用的是 SpringMVC  ,其他的同理,放在核心过滤器之前就OK,至于和其他过滤器,比如 Shiro  、 一些Listener UrlRewrite  什么的,上下先后顺序需要自己测试调整,有问题问我也可以!

那下面就上我的Filterweb.xml配置


<filter>
    <filter-name>url301Filterfilter-name>
    <filter-class>net.itboy.web.sitemap.filters.Url301Filterfilter-class>
filter>
<filter-mapping>
    <filter-name>url301Filterfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>


然后 二级域名  配置,这里你可以从 数据库  初始化,或者 数据库  查询,或者一些 nosql  DB,配置如下


#允许的2级域名
domain=tool#www#hao#admin#zhidao#i#so#music#fm#bean#ip#blog#trip#shop

Filter 代码如下

package net.itboy.web.sitemap.filters;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.itboy.web.sitemap.manager.UrlDisposeManager;

import org.springframework.web.filter.OncePerRequestFilter;

import common.utils.StringUtils;

import core.config.WYBConfig;

public class Url301Filter  extends OncePerRequestFilter{
    private static final String _ = "/" ;
	 
    private static final SetBASE_URL = new HashSet();
    static{
    	//加载合法的二级域名
    	String domians = WYBConfig.get("domain");
    	String[] domainArray = domians.split("#");
    	for (String domain : domainArray) {
    		if(!StringUtils.isBlank(domain)){
    			BASE_URL.add(domain);
    		}
	}
    }
    @Override
    protected void doFilterInternal(HttpServletRequest request,
		HttpServletResponse response, FilterChain filterChain)
		throws ServletException, IOException {
    String domain = request.getServerName();
    String url = request.getRequestURI();
    String requestUrl = String.format("http://%s%s", domain,url);
    System.out.println(requestUrl);
    //判断是否静态目录
    boolean disposed = UrlDisposeManager.urlDisposeByStaticPath(url);
    if(!disposed){
 	
    //首页
    url = url.endsWith(_) ? url + "index.html" : url ;
    //判断是不是静态文件
    //因为我是url301Filter 是拦截的所有
    if(!UrlDisposeManager.urlDisposeByStaticPath(url)){
	for(String uro : BASE_URL){
            if(domain.startsWith(uro +".") && !url.startsWith(_ + uro + _)){
		//组装新的地址
		url = StringUtils.merge(_,
			    uro,
			    ((!url.endsWith(".shtml") && !url.endsWith(".html"))?(url + ".html") : url)); 
		request.getRequestDispatcher(url).forward(request, response);
		return;
	    }
        }
        //其他页面   栏目以 ‘/’结尾
        if(url.endsWith("/")){
	    url = url + "index.html" ;
	    request.getRequestDispatcher(url).forward(request, response);
	    return ;
        }
        if(!url.endsWith(".shtml") && !url.endsWith(".html")){
	url = url + ".html" ;
			request.getRequestDispatcher(url).forward(request, response);
			return ;
		}
	}
    }
    /**继续 不平凡之路*/
    doFilter(request, response, filterChain);

}

HOST配置如下:

127.0.0.1 www.itnan.net tool.itnan.net admin.itnan.net

看到这就有点懵了。

我解释下我的这个Demo的原理和规则。

原理是Nginx解析是泛解析,就是itnan.net域名下的所有二级域名都解析过来。

然后比如:http://www.itnan.net/about 实际访问的是http://www.itnan.net/www/about.shtml

http://ip.itnan.net/实际访问的是 http://ip.itnan.net/ip/index.shtml

然后上一下Controller层的东西,就明白了。


@Controller
@Scope(value="prototype")
@RequestMapping("ip")
public class IPIndexController extends BaseController {
	private static final String IP_KEY_CACHE = "IP_KEY_CACHE:";
	private static final String IP_KEY_CACHE_LIST = "IP_KEY_CACHE_LIST:";
	/**首页*/
	@RequestMapping("index")
	public ModelAndView index(HttpServletRequest request){
		IPBo bo = IPManager.find(request);
		ModelAndView view = new ModelAndView("ip/index","bo",bo);
		return view;
	}
	
}

现在一看就明白了吧


下次有空我再讲一下,URL 伪静态  ,以及URL 伪静态  和这种 二级域名  结合的方式,这里比较复杂。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/77.html

转载时必须以链接形式注明原始出处及本声明。


如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
单个项目多个二级域名简单实现思路
IE、Firefox对同一域名访问并发限制,及解决优化方案
Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
Nginx 跳转到www二级域名域名重定向配置方法。
HttpClient获取访问域名的真实ip,HttpClient请求获取目标IP地址
Java 正则获取一级域名
查询任意一个域名是否是阿里云备案接入 API
HttpClient 多次请求session保持同一个Session
正则从URL中提取一级域名,支持大部分域名
Java获取域名Java从URL地址中获取域名Java从Request 获取域名
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...