-
利用urlRewriteFilter实现个性化域名
普通类 -
- 支持
- 批判
- 提问
- 解释
- 补充
- 删除
-
-
问题描述
余老师的一个需求:实现个人空间和社区的个性化域名访问,如我的个人空间源地址是http://lcell.bnu.edu.cn/myLc.jsp?psUserId=****,希望能通过http://lcell.bnu.edu.cn/chenmin 就是访问到。这样用户可以通过输入简单的地址直接访问空间了。
-
解决思路
实现方法
利用url重写的方法来实现。
首先要明白:url重写的方法只能重写后半截,即主机地址是不能重写的,即只能实现重写/myLc.jsp?psUserId=*** 的部分。
利用urlRewritefiler类库可实现url重写,下面以个人空间个性化域名的实现为例:
目标:用户通过输入”http://lcell.bnu.edu.cn/space/“+系统登录的用户名(如http://lcell.bnu.edu.cn/space/chenmin),即可访问他的个人空间
下面暂且将http://lcell.bnu.edu.cn/space/chenmin 成为个性域名,http://lcell.bnu.edu.cn/myLc.jsp?psUserId=*** 称为普通域名
步骤
1.下载urlrewritefilter类库,点击下载urlrewritefilter-3.2.0
2.配置web.xml
将以下代码加入到web.xml文件中
<!-- url 重写配置 开始 cm-->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- url 重写配置 结束 -cm -->我已经在web.xml中加入了此段代码,其他人不要重复再写了
3.在加入urlrewrite.xml配置文件(前面的下载包已经包含了此文件,只要做些修改即可)
在配置文件中主要是对映射规则进行设置,如下红色部分
<rule>
<note>
The rule means that requests to /test/status/ will be redirected to /rewrite-status
the url will be rewritten.
</note>
<from>^/space/(.*)$</from>
<to type="forward">/myLc.jsp?psUserName=$1</to>
</rule>解释:rule是url重写规则,from是显示出来的地址,to是映射的实际地址,$1是重写参数,可以为多个,()里是匹配的正则表达式.
”.*“正则表达式的意思是所有字符串
注意:<from>^/space/(.*)$</from> 中的space是我随便取得二级目录名称,最好是工程中不存在的名称,这样做的目的是防止除了个性域名与系统中原有的其他网页地址产生重复冲突。
另外,网上很多例子中没有这个二级目录,而直接写成<from>^/(.*)$</from>,这个在我们系统中也是不行的,这样的结果一个是可能导致个性域名与原有页面冲突,另一个方面严重的错误是用户输入lcell.bnu.edu.cn的首页地址时也被认为是个性域名,产生错误。
基本正则表达式的学习可参见:
http://wenku.baidu.com/view/b68839d43186bceb19e8bb55.html4.修改myLc.jsp页面
由于个性化的域名是由用户名构成的,传入的是用户,而我们原来的地址需要的参数是用户id,因此,要在个人空间首页的myLc.jsp页面中将用户名转换为用户id(根据用户名得到用户id)。代码如下:
String psUserName=request.getParameter("psUserName");
Long psUserId=0L;
if(psUserName!=null){//如果用户名获取不到,说明不是从个性域名跳转过来的,而是从普通域名过来的,普通域名传的是用户id参数
User u=UserService.getInstance().getByUserName(psUserName);//根据用户名获取user
psUserId=u.getId();
}else{
psUserId=Long.parseLong(request.getParameter("psUserId"));//直接从普通域名中获取userid
}这里要注意两点:
1)用户名不能重名(我们系统中的用户在注册时就是不允许重名,故不会出现重名现象。为了防止有脏数据,在根据用户名读取id时最好是读取列表,然后取第一个)
2)上面代码中要先判断是否存在用户名,不能先判断是否存在id(即逻辑不能变),否则会有错误
-
-
- 标签:
- 用户
- psuserid
- 域名
- http
- 用户名
- 地址
- lcell.bnu.edu.cn
- mylc.jsp
- 重写
- urlrewritefilter
- url
-
加入的知识群:
学习元评论 (0条)
聪明如你,不妨在这 发表你的看法与心得 ~