读书人

Filter阻截页面中include方式的请求

发布时间: 2012-09-10 11:02:32 作者: rapoo

Filter拦截页面中include方式的请求,并取得其请求的URL

?

最近需要在项目中做一个缓存框架,通过插件方式加入,要求可以通过配置文件,指定需要缓存页面的URL。

?

于是就想到做一个拦截器Filter。

?

该Filter可以首先拦截所有的请求,然后取得请求的URL,与配置中的需要缓存的URL对比,如果需要缓存,则进入缓存处理,如果不需要缓存,则直接到下一个Fitler。

?

具体的缓存处理,采用开源框架OScache。

?

方案还是比较简单的。 测试中发现,一般的Fitler只能拦截到从浏览器地址栏中过来的请求。 而页面的采用<jsp:include>方式载入的请求页面,则不能拦截到。

?

查看相关资料http://www.ibm.com/developerworks/java/library/j-tomcat2/后,得出结论:

?

在Servlet2.3中,Fitler是不能拦截include, forward, error 方式发来的请求的。

在Serlvet2.4中,则增强了Filter的功能,使之可以拦截到上面说的三个请求。 不过需要在配置文件中增加一个配置。

?

具体如下:

?

又发现一个问题:

在Filter中拦截到incldue方式的请求后,在取得传入的所有参数的时候,会把request 的请求参数也读出来。

?

比如:请求页面? /index.jsp?type1=request&param1=test1? 然后再 index.jsp页面中有一个 <jsp:include page="/main.jsp?type2=include&param2=test2"/>

?

当访问 /index.jsp?type1=request&param1=test1 时,使用上面的方法拦截到? include请求 /main.jsp?type2=include&param2=test2

?

Filter中的 在取得该请求的所有参数的时候,会将 /index.jsp的参数(type1=request&param1=test1)也读出来

?

   (String)request.getAttribute("javax.servlet.include.query_string"); 
?

该结果即为:type2=include&param2=test2? 正是需要的仅为 include 请求的参数。

读书人网 >软件架构设计

热点推荐