目录

一:引入问题:

二:url-pattern设置过滤范围简介:

三:案例演示

0.准备内容:

1.情况一:web.xml中的url-pattern是/test.jsp时:

2.情况二:web.xml中的url-pattern是/servlet/*时:

四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点

1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet

2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效

3.面对1、2两个注意点,一个不错的做法

4.复合url-pattern:同时过滤多种url

五:设置过滤范围:注解的写法


一:引入问题:

通常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

package com.imooc.filter;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class SampleServlet1*/
@WebServlet("/servlet/sample1")
public class SampleServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public SampleServlet1() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub// 仅为演示目的,这儿打印类名response.getWriter().println("This is"+this.getClass().getSimpleName());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

过滤器类:UrlPatternFilter:本篇博客的主要目的是url-pattern,所以在这个过滤器的doFilter方法中,就打印请求的url:

package com.imooc.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class UrlPatternFilter implements Filter{@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;// 这儿打印拦截到的urlSystem.out.println("拦截到"+req.getRequestURL()); // getRequestURL选用的是返回值为StringBuffer的那一个chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}

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了;

注解:<url-pattern></url-pattern>标签中的url值,如只写/servlet/*就行了,而不用写成/url-pattern/servlet/*,即其省略了上下文路径!


四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点

/:映射的问题:需要说明的几个容易出错的问题!!!

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进行拦截了。


五:设置过滤范围:注解的写法

过滤器六:url-pattern设置过滤范围相关推荐

  1. charles 过滤器-简单过滤和设置过滤

    charles 过滤器-简单过滤和设置过滤 一.简单过滤 二.设置过滤 一.简单过滤 二.设置过滤 打开位置 点击add添加要抓取的域名信息 排除筛选(操作和选择筛选一样)被指定的域名会被排除掉不会抓 ...

  2. STM32 CAN模块问题:1、CAN收发器断电后重新上电,CAN模块死机(离线)现象;2、过滤器配置完之后没有过滤效果

    做了一个项目,使用STM32F103VBT6来做GPS终端,在调试过程中发现两个问题,记录下来以便今后参考! 问题一: 给电路板上电,CAN模块正常收发,然后断电,此时因为有电池原因CPU不断电,正常 ...

  3. excel切片器显示错误_使用切片器在Excel中设置过滤条件

    excel切片器显示错误 In most cases, it's best if you keep people away from your data in Excel. It's too easy ...

  4. FFplay文档解读-21-音频过滤器六

    26.50 equalizer 应用双极峰值均衡(EQ)滤波器. 利用该滤波器,可以增加或减少所选频率处和附近的信号电平,同时(与带通和带阻滤波器不同)在所有其他频率处不变. 为了产生复杂的均衡曲线, ...

  5. 在URL上设置时间戳

    //获取当前的毫秒数 var timestamp =new Date().getTime();function ntimestamp() {return 't=' + new Date().getTi ...

  6. php ci url,URL路由设置-CI(codeigniter)PHP框架再探

    前面文章整体说了一下Codeigniter的访问,其中涉及到route,URL路由设置,下面对CI再说一下 在application/config/文件夹下有routes.php的设置. 1.首先说U ...

  7. 阿里企业邮箱设置过滤方法

    阿里企业邮箱设置过滤方法如下: 1.单击邮箱页面顶部的"邮箱设置"链接,然后单击新页面上的"筛选器". 2.进入"过滤"编辑页面,点击&qu ...

  8. Springboot应用中过滤器chain.doFilter后设置header无效

    Springboot应用中过滤器chain.doFilter后设置header无效 本文是在使用过滤器添加动态header过程中遇到设置header无效,经过研究源码而产生. 因为特殊需求,自定义的h ...

  9. Suspicious URL pattern: [/druid/**] ,进入不了druid的后台

    Suspicious URL pattern: [/druid/**] in context [], see sections 12.1 and 12.2 of the Servlet specifi ...

最新文章

  1. c语言储存10的500,c语言程序基础练习题500道
  2. 【c语言】hello
  3. java 静态实例_Java实例和静态方法
  4. 九 Deepin配置ssh访问gitee
  5. python 中的转义序列
  6. 第二百二十三节,jQuery EasyUI,ComboBox(下拉列表框)组件
  7. 英媒:中国媒体警告将挤走苹果 苹果股价应声下跌
  8. ABAP的自学之路 ,初步认识ABAP 一
  9. 2018.12.17-dtoj-1170-最长公共子串
  10. nginx 访问控制之 document_uri
  11. bug篇——MySQL的时区问题
  12. 想要轻松制作GIF图片,来看篇超全面的分析!
  13. phpstudy 提示安装VC9 VC14等,MySQL启动失败红色小点点,解决办法。PHP VC版本下载集合
  14. Navicat Premium 历史版本地址
  15. Linux沙箱技术介绍
  16. 对于网络文学而言 计算机叙事,90年代文学的“增量”
  17. 扫呗扫码点餐,如何在扫呗后台给这个商户配一下支付授权地址
  18. 散列——再散列与双散列(C++)
  19. java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统
  20. RISC-V架构生态及相关学习记录

热门文章

  1. 如果有一天我老无所依,请把我埋在,新疆的田野上
  2. 淘宝账号 支付宝账号 阿里旺旺账号
  3. python和scre_前端大牛们都学过哪些东西?
  4. 方便地边看便翻译原版pdf文章(wps)
  5. Linux内核实现名称空间的创建
  6. 30000台苹果电脑遭恶意软件入侵,包括最新的M1系列
  7. Flink OLAP 助力 ByteHTAP 亮相数据库顶会 VLDB
  8. abrt-hook-ccpp占用cpu过大,使用systemctl进行关闭
  9. 从零搭建外卖CPS外卖公众号教程,为你带来睡后收入
  10. word或wps中如何把visio或公式等转换为图片