需求1.1:
一级域名: http://www.iteye.com/
二级域名: http://firefly.iteye.com/
这里firefly其实会Mapping到用户ID,根据用户ID来展示不用用户的Blog,javaeye是通过Ruby实现的, 那Java如何实现这个Mapping呢?
需求1.2:
我们查看具体的哪一篇文章是通过 http://firefly.iteye.com/blog/785171 来访问的,这个URL是如何传参数的呢?
思路2:
A. 通过过滤器获得二级域名.(eg. firefly)
B. 对URL进行重写Rewrite.
实现3:
3.1 创建一个URLFilter过滤器,对所有的请求进行过滤
package com.firefly.web;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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 com.firefly.web.URLRewriter.URLMapping;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* Servlet Filter implementation class URLFilter
*/
public class URLFilter implements Filter {
List <URLMapping>urlPatternList;
public URLFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
/**
* 初始化
*/
String configPath=fConfig.getInitParameter("configPath");
String realConfigPath=fConfig.getServletContext().getRealPath(configPath);
FileInputStream input;
byte buff[]=null;
try {
input = new FileInputStream(realConfigPath);
buff=new byte[input.available()];
input.read(buff);
input.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 通过开源XStream来解析XML,并转化成Java对象
*/
XStream xstream = new XStream(new DomDriver());
xstream.alias("url", URLMapping.class);
xstream.alias("URLList", ArrayList.class);
urlPatternList=(List)xstream.fromXML(new String(buff));
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
/**
* 获得服务器名称,如:firefly.iteye.com/
*/
String serverName=request.getServerName();
int endIndex=serverName.indexOf(".");
/**
* 获得二级域名
* 二级域名一般是一个ID, 如:firefly
*/
String secondDomainName=serverName.substring(0, endIndex);
request.setAttribute("userID", secondDomainName);
if(secondDomainName.equalsIgnoreCase("www")){
httpServletRequest.getRequestDispatcher( "/index.html")
.forward(request, response);
return;
}else{
String realPath=this.getRealPath(httpServletRequest.getRequestURI());
httpServletRequest.getRequestDispatcher("/"+realPath)
.forward(request, response);
return;
}
}
/**
* 将URI转换成真正的请求URL
* e.g firefly.iteye.com/blog/785171 ->
* firefly.iteye.com/dispatcher.do?action=displayBlog&blogId=785171
* @param URI
* @return
*/
private String getRealPath(String URI){
for(URLMapping url:urlPatternList){
Pattern pattern=Pattern.compile(url.getPattern());
Matcher matcher=pattern.matcher(URI);
if(matcher.find()){
String reqPara=url.getReqParameter();
for(int i=1;i<=matcher.groupCount();i++){
reqPara=reqPara.replace("${"+i+"}", matcher.group(i));
}
return reqPara;
}
}
return URI;
}
}
3.2 创建URLMapping类
package com.firefly.web.URLRewriter;
public class URLMapping {
String pattern;
String reqParameter;
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public String getReqParameter() {
return reqParameter;
}
public void setReqParameter(String reqParameter) {
this.reqParameter = reqParameter;
}
}
3.3 在Web.xml中配置过滤器,对所有请求都进行处理
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>parseDomain</display-name>
<filter>
<description>
</description>
<display-name>URLFilter</display-name>
<filter-name>URLFilter</filter-name>
<filter-class>com.firefly.web.URLFilter</filter-class>
<init-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/URLRewriter.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>URLFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
3.4 在/WEB-INF下创建URLRewriter.xml
<?xml version="1.0" encoding="utf-8" ?>
<URLList>
<url>
<pattern>/order/(\d*)/(\d*)</pattern>
<reqParameter>dispatcher.do?action=order&productId=${1}&number=${2}</reqParameter>
</url>
<url>
<pattern>/blog/(\d*)</pattern>
<reqParameter>dispatcher.do?action=displayBlog&blogId=${1}</reqParameter>
</url>
</URLList>
附言: 如果要在本地测试二级域名,需要在hosts文件中配置如下参数(C:\WINDOWS\system32\drivers\etc\hosts)
127.0.0.1 firefly.iteye.com
分享到:
相关推荐
Nginx中rewrite实现二级域名、三级域名、泛域名、路径的重写[文].pdf
NULL 博文链接:https://lovexuwenhao.iteye.com/blog/437632
UrlRewrite域名重写,全套代码,是vs2005.net .net2.0
URLRewriter 当用户注册账号,后台审核,会为用户动态生成一个二级域名网站,
UrlRewrite一般都是在web.config里配置访问规则在路由到实际页面,所以先实现自定义节点信息读取,这里我定义了俩个类 webconfig定义了组,不需要的话可以把UrlRewriteConfigGroup类去掉并修改配置节点,在...
3 最重要的 在象Google Yahoo 和 Live 这样的搜索引擎中提高你网站上网页的搜索相关性 具体来说 URL重写经常能使你在你网站上">什么是UrlRewrite UrlRewrite 是 将动态页面转换为静态页面的一种技术 例如 您网站...
通过UrlRewrite组件实现url重写,可以优化url,对搜索引擎友好,被收录质量高等好处。
ASP.NET中实现二级或多级域名ASP.NET中实现二级或多级域名(修改UrlRewrite) 大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写,如:可将 ...
URL Rewrite是微软针对IIS推出的一种对URL进行重写的扩展模块,目前支持用于IIS7及以上版本。该模块使IIS管理员能够创建强大的自定义规则,语法支持正则规则以及通配符规则过滤。它能够根据HTTP头和IIS服务器变量...
confPath 默认 /WEB-INF/urlrewrite.xml 只支持一个配置文件,为了更好的阅读和维护,修改了源码: 1.如果想用原生的urlRewriteFilter confPath 请放完整地址(eg:WEB-INF/urlrewrite.xml); 2.如果想读多个配置文件,...
urlrewrite,实现伪静态页面,UrlRewrite技术隐藏实现细节,这样修改移植都很方便,而且完全不损失pagerank
UrlReWrite(Url重写或伪静态)UrlReWrite(Url重写或伪静态)
urlrewrite重写地址,Urlrewrite 2.5.2 现在有2.6版本的,自己去网上找吧
urlrewritefilter-4.0.3.jar urlrewrite.xml举例 web.xml(filter的配置)
现在对urlrewrite-3.2的源码进行了修改,使它能够支持多文件和通配符的形式加载自定义配置文件,即可以进行如下的配置: <param-name>confPath <param-value>/WEB-INF/urlrewrite/urlrewrite.xml /urlrewrite_*....
urlrewrite Jar包 urlrewrite-3.1.0.jar
URLRewrite URL重写组件 里边有相关配置说明 包括了web.Config 外附一个Css
java urlrewrite demo
UrlRewrite.rarUrlRewrite.rar
iis urlrewrite文件