Java 实现多个二级域名访问同一个Tomcat(系统)。
对于小成本站长,小公司,要实现多 二级域名 ,因为要多套环境,在成本上开销很大,并且麻烦复杂。还有一种需求,类似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 什么的,上下先后顺序需要自己测试调整,有问题问我也可以!
那下面就上我的Filter
,web.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
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。