用Filter动态变更访问URL

最近遇到一个客户需求,当用户在点击一个链接时,要求该链接自动转向另一个链接。主要用来规范已有的网站链接,形成模块化管理。例如,点击www.xxx.net/homesinfo自动跳转到www.xxx.net/wscz/home/index.jsp,类似的这样,方便网站管理人员统计链接。

基于此需求,我做了一个表,内容如上:

 

create table VIRTUALURL  (

   virtualurl_id                 NUMBER(10)                      not null, --ID

   virtualurl       varchar2(200), --发送给前端用户看的虚拟url

   realurl    varchar2(200),   --对应的真实url

   constraint PK_VIRTUALURL_ID primary key (virtualurl_id)

);

/

create sequence VIRTUALURL_ID_SEQ start with 1 increment by 1 cache 20

/

 

 

然后开始写代码。我用的是filter,想来想去也只有这样最好做了。可是好久都没有碰filter了哟,,郁闷,都有些想不起来了。回顾了一下,下面就是代码:

 

/** * @author hb Sep 9, 2010 过滤链接,将真实链接与虚拟链接做转换操作 */ public class PushUrlFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; PushUrlBo pushUrlBo = new PushUrlBo(); String reqUrl = req.getRequestURI(); //过滤根目录 String contextPath = req.getContextPath(); if(contextPath != null && contextPath != "" &&reqUrl.contains(contextPath)) { reqUrl = reqUrl.replace(contextPath, ""); } //过滤除IP与根目录外的URL List<PushIVirtualurl> urlList = pushUrlBo.getAllList(); if (urlList.size() != 0) { for (PushIVirtualurl piv : urlList) { if (reqUrl.contains(piv.getVirtualurl())) { reqUrl = reqUrl.replace(piv.getVirtualurl(), piv.getRealurl()); RequestDispatcher dispatcher = req.getRequestDispatcher(reqUrl); dispatcher.forward(request, response); return; } } } chain.doFilter(request, response); } public void init(FilterConfig config) throws ServletException { } } 然后在web.xml文件中配置吧!

这里主要看requestDispatcher和chain.doFilter。由于好久没用了,不管转向什么页面总是报未找到。很奇怪,偶然间想到,是不是在forward之后继续执行下面的代码呢???测试一下,果然,程序在forward之后居然还会执行下面的代码,这种问题甚至会造成死循环。如果在forward之后继续执行过滤链(chain.doFilter(xxx,xxx))的话,那后台将报response重复提交这个错误。呵呵,开始蛮郁闷的。so,在forward语句之后,加上return ; 解决问题了!

综上所述:知识还是要不断的温故知新的。

你可能感兴趣的:(cache,String,filter,table,null,url)