java实现泛域名解析,附SpringMVC源码示例
2010-07-08 20:58
856 查看
所谓“泛域名解析”是指:利用通配符 * (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。
例如支付宝的域名是www.alipay.com
域名下面有帮助中心help.alipay.com 、abc.alipay.com 等等子站点。有实力的公司一般都是通过硬件的方式来实现的
但是对于一般人,这么做投入太大,可以通过程序来实现伪的“泛解析”
比如:javaeye,目前就是通过代码来实现的泛解析。javaeye是ruby的,具体实现感兴趣的可以找找看,原理都是类似的
同样的java也可以实现。java实现方式。1,修改DispatcherServlet。2,通过fielter实现。
第一种方法,如果是自己来做重写DispatcherServlet也不是什么难事,但是这么做入侵性太大,性能好一点。
第二种方法,通过fielter实现,入侵相对小点。
现在主要发一下fielter实现的方式。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/26/533645a4fcae55a10321c7686f515a32.jpg)
上图是示例程序的目录结构,通过mvn自动生成的。
核心的处理fielter
在fielter里面我们会做两件事情
http://blog.test.com ==> http://www.test.com/blog/ http://blog.test.com/article/1633 ==> http://www.test.com/blog/article.htm?id=1633
由于是代码层面实现的转发,所以需要存在一点的url规则。
web.xml中只需要将请求转发过来即可。并将url通过过滤器来转换
本例中还有velocity的layout使用方法
这样就velocity就可以很方便的使用了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/26/e120a8c98e63571f862ac584a0cf8013.jpg)
图片是访问页面的结果,一个blog的二级域就OK了
题外话:java还是太臃肿了,适合大企业,IDE很强大,各种语法错误,编译错误在早期能快速的被发现,当系统搭建完毕之后不必担心会有什么大问题,只需要招一堆程序员在上面搞业务就行了,处理复杂的业务是强项,不过确实是太臃肿了。
流行的三层架构,如果是web2.0用java搞会疯掉的,一个web层小问题的修改,哪怕一行代码,你要重新编译、部署。。。所以适当的把web层用脚本语言来做肯定效率是迅速的,比如,后端很复杂的逻辑全部java实现封装,前端的展示,数据的校验,交互全部可以通过脚本语言来实现,效率肯定是空前的高效。
但是也会带来一些新的问题(代码太过自由化不好控制,错误在初期不容易发现)至少目前国内还没有这方面结合的公司有应用的生产环境,但是如果想追求效率,这么做肯定是没问题的,至少我是这么认为的。当然公司可能会觉得招聘人员的成本增加了。本来招一个java的程序员所有都可以搞了,现在还要招不同的人做不同的事。
附:源码点此下载 (鄙视下csdn,上传个文件半天不显示。。。只好借javaeye的宝地一用了)
源码为mvn的例子,只用在根目录,mvn jetty:run即可运行
因为是测试二级域名的解析,所以要配置host。
C:/WINDOWS/system32/drivers/etc/host文件中增加 127.0.0.1 blog.xxx.com photo.xxx.com来测试
例如支付宝的域名是www.alipay.com
域名下面有帮助中心help.alipay.com 、abc.alipay.com 等等子站点。有实力的公司一般都是通过硬件的方式来实现的
但是对于一般人,这么做投入太大,可以通过程序来实现伪的“泛解析”
比如:javaeye,目前就是通过代码来实现的泛解析。javaeye是ruby的,具体实现感兴趣的可以找找看,原理都是类似的
同样的java也可以实现。java实现方式。1,修改DispatcherServlet。2,通过fielter实现。
第一种方法,如果是自己来做重写DispatcherServlet也不是什么难事,但是这么做入侵性太大,性能好一点。
第二种方法,通过fielter实现,入侵相对小点。
现在主要发一下fielter实现的方式。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/26/533645a4fcae55a10321c7686f515a32.jpg)
上图是示例程序的目录结构,通过mvn自动生成的。
核心的处理fielter
/** * 虚拟域名实现。<br> * <li>http://二级域名.域名/目标页面/参数 * <li>http://blog.test.com ==> http://www.test.com/blog/ * <li>http://blog.test.com/article/1633 ==> http://www.test.com/blog/article.htm?id=1633 * @author yuezhen * @version $Id: DomainFielter.java,v 0.1 2010-3-17 下午01:21:59 yuezhen Exp $ */ public class DomainFielter implements Filter { private static final String DOMAIN = "alipay-local.com"; private static final String SEP = "/"; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String domainName = ""; // 获取域名 String serverName = request.getServerName(); // 获取请求路径 String path = httpServletRequest.getRequestURI(); // 判断是否是三级域名 int end = serverName.indexOf(DOMAIN); // 获取domain if (end != -1 && end != 0) { domainName = serverName.substring(0, end - 1); } else { domainName = "www"; } // 获取目标页面(可选,http://username.test.com/article/1633)获取后面的参数 String distPage = getDistPage(path); String id = getId(path); // domain不为空 if (domainName != null && !"".equals(domainName) && !"www".equals(domainName)) { // http://blog.test.com/article/1633 ==> http://www.test.com/blog/article.htm?id=1633 if (id != null && !id.equals("")) { httpServletRequest.getRequestDispatcher( SEP + domainName + SEP + distPage + ".htm" + "?id=" + id).forward(request, response); return; } else { // http://blog.test.com ==> http://www.test.com/blog/ httpServletRequest.getRequestDispatcher(domainName + SEP) .forward(request, response); return; } } chain.doFilter(request, response); }
在fielter里面我们会做两件事情
http://blog.test.com ==> http://www.test.com/blog/ http://blog.test.com/article/1633 ==> http://www.test.com/blog/article.htm?id=1633
由于是代码层面实现的转发,所以需要存在一点的url规则。
<filter> <filter-name>DomainFielter</filter-name> <filter-class>org.fielter.domain.test.DomainFielter</filter-class> </filter> <filter-mapping> <filter-name>DomainFielter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
web.xml中只需要将请求转发过来即可。并将url通过过滤器来转换
本例中还有velocity的layout使用方法
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath"> <value>WEB-INF/page/</value> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"> <property name="suffix"> <value>.vm</value> </property> <property name="layoutUrl" value="layout/layout.vm"/> <!-- if you want to use the Spring Velocity macros, set this property to true --> <property name="exposeSpringMacroHelpers" value="true"/> <!-- variable to override layoutUrl --> <property name="layoutKey" value="layout"/> <property name="screenContentKey" value="screen_content"/> </bean>
这样就velocity就可以很方便的使用了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/26/e120a8c98e63571f862ac584a0cf8013.jpg)
图片是访问页面的结果,一个blog的二级域就OK了
题外话:java还是太臃肿了,适合大企业,IDE很强大,各种语法错误,编译错误在早期能快速的被发现,当系统搭建完毕之后不必担心会有什么大问题,只需要招一堆程序员在上面搞业务就行了,处理复杂的业务是强项,不过确实是太臃肿了。
流行的三层架构,如果是web2.0用java搞会疯掉的,一个web层小问题的修改,哪怕一行代码,你要重新编译、部署。。。所以适当的把web层用脚本语言来做肯定效率是迅速的,比如,后端很复杂的逻辑全部java实现封装,前端的展示,数据的校验,交互全部可以通过脚本语言来实现,效率肯定是空前的高效。
但是也会带来一些新的问题(代码太过自由化不好控制,错误在初期不容易发现)至少目前国内还没有这方面结合的公司有应用的生产环境,但是如果想追求效率,这么做肯定是没问题的,至少我是这么认为的。当然公司可能会觉得招聘人员的成本增加了。本来招一个java的程序员所有都可以搞了,现在还要招不同的人做不同的事。
附:源码点此下载 (鄙视下csdn,上传个文件半天不显示。。。只好借javaeye的宝地一用了)
源码为mvn的例子,只用在根目录,mvn jetty:run即可运行
因为是测试二级域名的解析,所以要配置host。
C:/WINDOWS/system32/drivers/etc/host文件中增加 127.0.0.1 blog.xxx.com photo.xxx.com来测试
相关文章推荐
- java实现泛域名解析,附SpringMVC源码示例
- Java实现身份证号码验证源码示例分享
- Java实现的打地鼠小游戏完整示例【附源码下载】
- AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
- java中使用线程实现Timer(定时器)原理和源码
- Java实现Swing组件定制Button示例
- java拓扑排序实现源码
- java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)
- Java HashMap实现原理 源码剖析
- 使用模板方法模式实现可扩展性设计(Java示例)
- Java版色情图像过滤入门示例及源码-0.1.0 (模拟GreenDam过滤机制)
- java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例
- java爬取网络文件源码实现
- java_集合体系之ArrayList详解、源码及示例——03
- Java简单实现session保存到redis的方法示例
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(4):数据初始化(三)
- 【新技术,学习、商业均可】HTML5 全新高大尚后台 bootstrap springmvc mybatis java企业级通框架源码入门
- Java____Timer实现定时功能及其源码研究