up:: 过滤器开发技巧之过滤器参数化
一:引入问题:
通常url-pattern设置成“/*”;即对所有请求进行过滤;但是当有特殊要求的时候,即改变过滤范围的时候如何做?
二:url-pattern设置过滤范围简介:
三:案例演示
0.准备内容:
案例:包括UrlPatternFilter过滤器类;SampleServlet1这个Servlet类;test.jsp;
test.jsp:访问的url为:localhost:8080/url-pattern/test.jsp
SampleServlet1这个Servlet:访问的url为:localhost:8080/url-pattern/servlet/sample1
过滤器类:UrlPatternFilter:本篇博客的主要目的是url-pattern,所以在这个过滤器的doFilter方法中,就打印请求的url:
1.情况一:web.xml中的url-pattern是/test.jsp时:
当web.xml中的url-pattern是/test.jsp时:即此时是资源的精准匹配。
访问test.jsp时:
但是如果,访问SampleServlet1的时候:
2.情况二:web.xml中的url-pattern是/servlet/*时:
如果想让过滤器拦截到localhost:8080/url-pattern/servlet/sample1,url-pattern应该这样设置:
效果:发现,此时可以拦截到localhost:8080/url-pattern/servlet/sample1了;
*注解:
四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点
/:映射的问题:需要说明的几个容易出错的问题!!!
1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet
首先,创建SampleServlet2:这个Servlet的url为“/”,即代表,要把这个Servlet设置成项目的默认首页,即当直接访问localhost:8080/url- pattern/的时候,会访问这个Servlet,然后这个Servlet会转到特定的前端界面(html或jsp等啦);
同时,web.xml中的过滤器的url-pattern设置为:“/”,以期访问SampleServlet2的时候,过滤器能够拦截这个请求:
如果访问:localhost:8080/url-pattern/:后面不增加其他任何资源,其直接访问的是SampleServlet2(即此时,SampleServlet2看来就像是应用的“默认首页”(其实不能这么说啦));同时,过滤器也拦截了这个请求;
但是,需要注意,这个“/”映射web应用根路径的时候,只对Servlet起作用!而且:默认的首页index.jsp会让其失效!!!
2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效
如果此时在项目中,增加一个index.jsp:默认首页
*那么此时,访问localhost:8080/url-pattern/的时候,SampleServlet2和index.jsp哪个生效嘞?
此时, 再访问localhost:8080/url-pattern/:后面不增加其他任何资源的时候,访问的是默认首页index.jsp,而不是访问SampleServlet2了;同时在程序的控制台,也并没有被过滤器拦截的记录。
疑问: 即也配置了SampleServlet2的url为“/”,即设置了根路径,,也在web.xml中配置了过滤器url-pattern为“/”;为什么访问localhost:8080/url-pattern/的时候,不仅没有访问SampleServlet2,而且过滤器也没有对localhost:8080/url-pattern/进行拦截呐???
原因: 这里涉及到了Tomcat的一个底层机制,尽管在url中访问的是“/”(根路径,也就是localhost:8080/url- pattern/啦),但是因为web.xml配置了默认首页(就是index.html,index.jsp那些啦),实际上在访问localhost:8080/url-pattern/这个根路径的时候,隐式的跳转到了index.jsp; 同时过滤器并没有拦截index.jsp;
同时发现,默认首页的优先级是比Servlet(url设置成”/“)要高的,一旦设置了默认首页(如有了index.jsp)后,会让上面的那个路径设置成“/”的SampleServlet2失效,也就是上面所说的“ 默认首页index.jsp会让“/”的作用失效 ”。
如果,已经有了index.jsp,还想让过滤器对index.jsp(默认首页)进行拦截的话,此时过滤器的url-pattern需要设置成:*.jsp,或者/index.jsp才行;
3.面对1、2两个注意点,一个不错的做法
为了避免上述问题,不错的做法是:在实际项目开发中,尽量不要设置index.jsp这样的默认首页;而是设置url为“/”的Servlet,通过这个映射到根路径的Servlet,来去跳转到指定的页面进行显示。这样做可以保证(url设置成“/”的)Servlet不会失效,又能手动的控制我们要显示的页面是哪个;!
4.复合url-pattern:同时过滤多种url
对于过滤器来说,既想对默认根路径进行过滤,又想对所有jsp进行过滤,还想对所有Servlet前缀的url进行过滤,这种复合的应该怎么做?
结果:发现,此时访问默认首页index.jsp也被过滤器拦截了:很简单,因为,index.jsp是默认首页,当浏览器访问localhost:8080/url-pattern/的时候,自然会访问index.jsp;但是,又因为在过滤器中添加了*.jsp,所以自然也会对index.jsp进行拦截了。