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¶m1=test1? 然后再 index.jsp页面中有一个 <jsp:include page="/main.jsp?type2=include¶m2=test2"/>
?
当访问 /index.jsp?type1=request¶m1=test1 时,使用上面的方法拦截到? include请求 /main.jsp?type2=include¶m2=test2
?
Filter中的 在取得该请求的所有参数的时候,会将 /index.jsp的参数(type1=request¶m1=test1)也读出来
?
(String)request.getAttribute("javax.servlet.include.query_string");?该结果即为:type2=include¶m2=test2? 正是需要的仅为 include 请求的参数。