因工作原因,要实现一个动态的栏目,使用独立的地址访问。例如对于项目xxx使用http://localhost:8080/xxx/aaa可访问栏目aaa。

“海词”网站(http://dict.cn/)实现了“地址栏一步查词”,具有类似的功能。

提出了两种方案:

1、建立固定结构目录aaa,可使用要求的地址访问。当建立新栏目时,程序拷贝aaa目录,修改目录名实现。

2、使用过滤器,拦截浏览器对http://localhost:8080/xxx/aaa的访问,并转发某个固定的Servlet,将aaa作为参数传给转发的Servlet中。

使用解决方案1,当程序变更时,需要更改每一个目录下的程序,所以优先尝试方案2。

首先建立一个Servlet,为了简单模拟动态页面,只是读取一个参数,并打印到页面中

public class HostTestServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String msg = request.getParameter("id");PrintWriter out = response.getWriter();out.print(msg);out.flush();out.close();}
}

对于过滤器来说,要拦截所有请求并进行地址分析,只有满足条件的才进行转发,这里的条件就是存在的栏目名

下面编写一个类,检测某个字符串是否为栏目名

public class HostTable {private static String[] hosts = new String[]{"hello","123"};public static boolean isHost(String str) {for (String s : hosts) {if (str.equals(s)) {return true;}}return false;}
}

下面实现一个过滤器,具体过程见注释

public class HostFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterchain) throws IOException, ServletException {HttpServletRequest httpreq = (HttpServletRequest) request;HttpServletResponse httpres = (HttpServletResponse) response;// 获取当前项目的appNameString appName = httpreq.getContextPath();// 获取请求的URLStringBuffer requestUrl = httpreq.getRequestURL();System.out.println("过滤器,请求的地址:" + requestUrl);// 获取参数int pos = requestUrl.lastIndexOf(appName + "/");if (pos >= requestUrl.length() || pos < 0) {httpres.sendRedirect("/index.jsp");return;} else {String parmar = requestUrl.substring(pos+appName.length()+1, requestUrl.length());// 检测参数是否是允许的访问地址if (HostTable.isHost(parmar)) {String url = "servlet/HostTestServlet?id="+parmar;System.out.println("过滤器,转到的地址:" + url);// 页面转向,浏览器地址栏能看到新的URL地址//httpres.sendRedirect(url);// 页面转发,地址栏看不到新地址request.getRequestDispatcher(url).forward(request,response);return;} else {System.out.println("参数parmar不在允许访问的地址列表中");filterchain.doFilter(httpreq,httpres);}}}
}

将Servlet和Filter注册到web.xml文件

在web.xml文件的<web-app></web-app>之间加入以下内容

        <filter><filter-name>HostFilter</filter-name><filter-class>lmsk.sy.hostFilter.HostFilter</filter-class></filter><filter-mapping><filter-name>HostFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>HostTestServlet</servlet-name><servlet-class>lmsk.sy.hostFilter.HostTestServlet</servlet-class></servlet><servlet-mapping><servlet-name>HostTestServlet</servlet-name><url-pattern>/servlet/HostTestServlet</url-pattern></servlet-mapping>

测试

发布到Tomcat,

在浏览器访问http://localhost:8080/HostTest/hello,页面上输出了hello

在浏览器访问http://localhost:8080/HostTest/123,页面输出了123

同时,控制台输出了调试信息

过滤器,请求的地址:http://localhost:8080/HostTest/hello
过滤器,转到的地址:servlet/HostTestServlet?id=hello
过滤器,请求的地址:http://localhost:8080/HostTest/123
过滤器,转到的地址:servlet/HostTestServlet?id=123

尝试访问某个未注册的值,出现404错误,同时控制台输出

过滤器,请求的地址:http://localhost:8080/HostTest/aaa
参数parmar不在允许访问的地址列表中

也可以修改过滤器代码,使出现该错误时,转到一个自定义的页面上。

通过重写HostTable.isHost(),让它根据数据库内容检测,可以实现栏目的动态地址访问。

补充:

1、应用到Struts2中时,发现不能正常转发.action请求。

原因是默认情况下,struts2的核心过滤器会过滤request请求,不会过滤forward请求。

解决方法是在web.xml文件配置核心过滤器的参数

        <!-- 配置核心拦截器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>

加入了<dispatcher>REQUEST</dispatcher>和<dispatcher>FORWARD</dispatcher>。

参考资料:http://hi.baidu.com/dimm456852/blog/item/7d66c3c7e2d5ffa78326ac46.html/cmtid/dbb11ed017721a0e3af3cfb9,感谢!

转载于:https://www.cnblogs.com/S-E-P/archive/2012/02/01/2334918.html

为动态栏目生成独立的地址相关推荐

  1. 用XMLHTTP获取动态页生成的HTML内容

    用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件.这句话是在蓝色理想上看到的,对XMLHTTP吟清还 ...

  2. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  3. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  4. PHP多文字,二维码(动态、非动态)生成海报方式

    PHP多文字,二维码(动态(支持带logo).非动态)生成海报方式 1.下载二维码插件Phpqrcode,地址 [https://sourceforge.net/projects/phpqrcode/ ...

  5. ASP动态网页生成静态Html网页代码

    [摘 要] 生成html网页有利于被搜索引擎收录,不仅被收录的快还收录的全.前台脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度. 网页生成静态Html文件有许多好处,比如生成html网页有利 ...

  6. [AAQuto-v30.2.7] aardio桌面软件开发工具+一键发布为绿色软件+生成独立EXE执行文件

    介绍 aardio是专用于桌面软件快速开发的新一代混合型编程语言,aardio支持COM动态.静态接口.支持标准DLL组件,兼具动态.静态语言优势,兼容流行C系语法.Pascal语法,学习成本最低. ...

  7. 在网页中动态的生成一个gif图片

    作者: love.net 大家知道股票网站的K线图是动态生成的定时刷新PHP 就有动态生成图片的功能 那么怎样用asp.net在网页中动态的生成一个图片呢? 下面我要举的例子是动态的生成一个图片显示当 ...

  8. java selectcommand_“对于不返回任何基表信息的 SelectCommand 不支持动态SQL生成”-奇怪的错误,不知道原因! | 学步园...

    OleDbCommandBuilder更新Access数据库中遇到的问题 部分代码如下: //AccountQuery.aspx.cs protected void FormView1_ItemUpd ...

  9. python输入ip地址_python批量生成本地ip地址的方法

    本文实例讲述了python批量生成本地ip地址的方法.分享给大家供大家参考.具体分析如下: 这段代码用于在本地计算机上生成本地ip地址绑定到网卡,生成的是一个bat的批处理文件,运行此批处理文件,可以 ...

最新文章

  1. Python超简单容易上手的画图工具库
  2. BZOJ 3694DTOJ 1972: 最短路
  3. wine应用运行后字体都是问号
  4. c#简单自定义异常处理日志辅助类
  5. 为甚么 国企做互联网总做不起来?
  6. 关于静态成员变量的谈论
  7. Excel计数(count)可视化
  8. 《原力计划【第二季】》第 6 周周榜揭晓!!!
  9. ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
  10. fatal: “Could not read remote” -- Mac下使用Git Push显示权限错误
  11. 数据仓库与数据挖掘(二)
  12. 如何修改CSDN的ID号
  13. Unity CommandBuffer实现毛玻璃特效
  14. 高阶篇:4.1.2.2)产品部件级别的QFDII
  15. OSChina 周三乱弹 —— who's your 大爷
  16. 终极解决Excel科学计数、日期变#号等问题
  17. Win10神州网信政府版(企业版G)安装
  18. 一个强化学习 Q-learning 算法的简明教程
  19. viper12a电路图_viper12a电磁炉电路图
  20. [-7170]:Bakres failed to connect DMAP

热门文章

  1. stm32F103RCT6的DMA使用经历
  2. 实名认证API到底对互联网应用开发有没有帮助?
  3. java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告
  4. WP论坛WordPress主题免费下载(2)
  5. 【奇函数】问题:奇函数是否一定过零点?
  6. 获取最新的安全资讯与技术
  7. 专利申请快速预审服务指南
  8. Failed to resolve: com.aliyun.ams:alicloud-android-utdid:1.1.5.4的解决办法
  9. 字体美化方案(Dapper+WQY+MSfont)(11.1 更新英文字体美化)[转]
  10. 微信小程序 - 超详细 “长按说话“ 实时语音录制与播放功能,仿微信发语音 “按住说话,松开取消“ 录音功能效果(详细示例源码,一键复制开箱即用!)