利用泛解析和Filter实现动态二级域名

标签: 利用 解析 filter | 发表时间:2015-12-26 20:13 | 作者:namezhou
出处:http://www.iteye.com

itEye等网站有个很不错的机制,就是每个用户都有一个永久的二级域名 正好所在的项目也想实现这样的功能,研究了一下,发现用过滤器实现最简单,

http://7784.namezhou.com 实际打开的是 http://www.namezhou.com/7784

步骤如下:

 

1.去DNS供应商开启泛解析,就是加一条cname记录*.namezhou.com 指向www.namezhou.com

2.编写一个Filter,当检测到是二级域名xxx.namezhou.com时,把地址跳转成http://www.namezhou.com/xxx

代码如下:

import java.io.IOException;

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

/**
 * 泛域名解析过滤器
 * @author namezhou
 * @since Dec 26, 2015
 */
public class DomainFilter implements Filter{
	private String mainDomain;//主域名裸域地址
	private String expectDomain;//排除域名,分号隔开
	public String getMainDomain() {
		return mainDomain;
	}
	public void setMainDomain(String mainDomain) {
		this.mainDomain = mainDomain;
	}
	public String getExpectDomain() {
		return expectDomain;
	}
	public void setExpectDomain(String expectDomain) {
		this.expectDomain = expectDomain;
	}
	@Override
	public void destroy() {
		
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		String url = ((HttpServletRequest)request).getRequestURI();
		String host = request.getServerName();
		boolean redirect = false;
		if(host.equals(mainDomain)){
			//访问的裸域
			chain.doFilter(request, response);
		}else if(expectDomain!=null&&expectDomain.trim().length()>0){
			String[] arr = expectDomain.split(";");
			if(arr!=null&&arr.length>0){
				for (int i = 0; i < arr.length; i++) {
					if(host.equals(arr[i]+"."+mainDomain)){
						//排除的域,直接显示
						redirect = true;
						chain.doFilter(request, response);
					}
				}
			}
		}
		if(!redirect){
			//检查是不是有
			String id = host.replace("."+mainDomain, "");
			((HttpServletResponse)response).sendRedirect("http://www.namezhou.com/"+id);
		}
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		expectDomain = arg0.getInitParameter("expectDomain");
		mainDomain = arg0.getInitParameter("mainDomain");
	}
}

 3.配置该Filter

<!-- 泛域名解析过滤器 start -->
	<filter>
		<filter-name>domainFilter</filter-name>
		<filter-class>com.namezhou.common.filter.DomainFilter</filter-class>
		<init-param>
			<param-name>mainDomain</param-name>
			<param-value>namezhou.com</param-value>
		</init-param>
		<init-param>
			<param-name>expectDomain</param-name>
			<param-value>www;dev</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>domainFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 泛域名解析过滤器 end -->

 

博客里面还有另外一种基于Apache rewrite模块的实现方法,与那种方法比较起来,过滤器实现方式

优点:简单,逻辑清晰,实现方便,

缺点:访问地址会变,当然也可以弄一个空iframe页面,去嵌入需要显示的页面,但略显山寨



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [利用 解析 filter] 推荐:

利用泛解析和Filter实现动态二级域名

- - 企业架构 - ITeye博客
itEye等网站有个很不错的机制,就是每个用户都有一个永久的二级域名 正好所在的项目也想实现这样的功能,研究了一下,发现用过滤器实现最简单,. http://7784.namezhou.com 实际打开的是 http://www.namezhou.com/7784. 1.去DNS供应商开启泛解析,就是加一条cname记录*.namezhou.com 指向www.namezhou.com.

Servlet Filter 学习

- - CSDN博客架构设计推荐文章
最近在研究CAS , CAS 中的Servlet Filter 不太熟悉, 所以花了点时间学下了下这部分的知识, 分成以下几部分 学习. Servlet Filter  的功能和用法. Servlet Filter 顺序的注意事项. A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

Servlet、Filter和Listener

- - Web前端 - ITeye博客
Java Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式. Servlet可完成以下功能:. 1、创建并返回基于客户请求的动态HTML页面.

Bloom Filter 原理与应用

- - CSDN博客云计算推荐文章
Bloom Filter是一种简单的节省空间的随机化的数据结构,支持用户查询的集合. 一般我们使用STL的std::set, stdext::hash_set,std::set是用红黑树实现的,stdext::hash_set是用桶式哈希表. 上述两种数据结构,都会需要保存原始数据信息,当数据量较大时,内存就会是个问题.

dubbo中的Filter顺序

- - 互联网 - ITeye博客
最近发现dubbo的小 bug,顺便整理了一下dubbo中的Filter调用顺序及如何确定的. 服务提供方的过滤器被调用顺序:. EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->(这4个是在代码中指定的). 服务消费方的过滤器顺序:.

activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver解释

- - CSDN博客推荐文章
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent).

webservice的安全机制3---Filter

- - 博客园_首页
本节摘要:本节继续讨论webservice的安全机制,本节采用servlet的过滤器Filter来实现.    前面讲了webservice的安全机制1和2,本节继续webservice的安全之旅,.    本节采用servlet的Filter的来实现对webservice的安全访问.    在调用webservice之前,过滤器会拦截匹配的请求,只有满足安全要求的客户端才能访问webservice服务.

【转】Servlet 和filter 执行顺序

- - 企业架构 - ITeye博客
一,servlet容器对url的匹配过程:. 当一个请求发送到servlet容器的时候,容器 先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test /aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做 servlet的映射匹配.

[译]JVM上最快的Bloom filter实现

- - 鸟窝
英文原始出处: Bloom filter for Scala, the fastest for JVM. 本文介绍的是我用Scala实现的Bloom filter. 依照 性能测试结果,它是JVM上的 最快的Bloom filter实现. 零分配(Zero-allocation)和高度优化的代码.

JVM上最快的Bloom filter实现

- - ImportNew
英文原始出处:  Bloom filter for Scala, the fastest for JVM. 本文介绍的是我用Scala实现的Bloom filter. 依照 性能测试结果,它是JVM上的 最快的Bloom filter实现. 零分配(Zero-allocation)和高度优化的代码.