defaultServlet与Filter过滤器

defaultServlet

DefaultServlet是配置在Tomcat服务器的web.xml文件中的一个Servlet,这个Servlet如其名是一个服务器中默认的Servlet。我们都知道进行Web访问时首先所有的请求都会进入Tomcat,然后这些请求都会先流经DefaultServlet,接着再流到指定的Servlet上去,如果没有匹配到任何应用指定的servlet,那么就会停留在DefaultServlet,所以DefaultServlet也有着一定的拦截作用。这个Servlet,主要作用是处理其他servlet没有处理的请求,如图片文件、网页文件、.js文件等。我们知道,在我们工程的web.xml中,会配置servlet映射,但是有些访问无法找到映射时,如一些静态图片,一些js文件等,那服务器是如何返回给客户端的呢?这就是DefaultServlet要做的事情,所以说可以让DefaultServlet来管理静态资源。
我们来看看这个Servlet是怎样被声明的,首先在你的Eclipse中找到Serves工程,然后再Tomcat目录下找到web.xml:
defaultServlet与Filter过滤器

<br>
DefaultServlet就配置在这个文件中:
defaultServlet与Filter过滤器
如图,我们可以看到这个Servlet类所在的路径是org.apache.catalina.servlets.DefaultServlet,并且启动等级是1,也就是说服务器启动的时候这个Servlet就被加载了。
然后往下拉,可以找到DefaultServlet映射的web访问名称:
defaultServlet与Filter过滤器
DefaultServlet映射的web访问名称是“/”(根),所以除了指定的Servlet外的所有资源请求最终都会访问到DefaultServlet上。
也就是说我们访问web服务器的时候只要不是访问其他Servlet的话,就会访问到这个DefaultServlet上。
我们也可以自己重写这个DefaultServlet,把web访问名称声明为“/”就可以了,代码示例:
defaultServlet与Filter过滤器

<br>
然后我在浏览器中随便访问一些不存在的文件:
defaultServlet与Filter过滤器
如图,可以看到全部的请求都访问到这个Servlet上了,只要没有匹配指定的Servlet的请求,都会访问到这里来,即便是请求一个不存在的资源。

<br>
例如我再创建一个Servlet:
defaultServlet与Filter过滤器

<br>
在浏览器中访问这个Servlet后控制台的打印结果:
defaultServlet与Filter过滤器

<br>
然后我访问这个Servlet下不存在的文件资源:
defaultServlet与Filter过滤器
如图,可以看到访问到了DefaultServlet上,从这个实验可以看出只要没有被指定的Servlet处理的访问请求,都会访问到DefaultServlet上,不管这个访问的资源是否存在,但是有一点要注意的是:.jsp文件的访问请求不会被DefaultServlet所拦截,因为jsp已经有在Tomcat的web.xml文件中配置web访问名称了。

<br>
综上所述DefaultServlet最主要的一点还是可以用于管理静态资源,我们可以通过DefaultServlet去优化静态资源的访问速度。例如:在服务端上将访问过的静态资源缓存到内存中,客户端请求同一个资源的时候就可以直接在内存中输出,不用再去磁盘上读取,我们都知道内存的速度要比磁盘快很多,所以这种方式可以使访问速度提升。除此之外,我们还要设置一下静态资源的过期时间,让这个资源可以在一定的时间内缓存在用户的浏览器中,免得每次访问都需要请求服务器,增加服务器的压力。这种形式可以在Spring MVC框架中得到较好的实现,不过我们也可以自己手写一个基于这种原理的简单优化,代码示例:
defaultServlet与Filter过滤器
defaultServlet与Filter过滤器

<br>
我们来看看第一次访问此图片的速度:
defaultServlet与Filter过滤器
<br>
第二次进行访问:
defaultServlet与Filter过滤器
可以看到,速度快了一半以上,虽然单独这样一张图片好像提升不大,但是一般的网页都是会向服务器下载几十上百个静态资源的,在资源量大的情况下就会发现访问速度提升了。

<br><br><br>

Filter过滤器

<br>

Filter简介:

  Filter 技术是servlet 2.3新增加的功能。servlet2.3是sun公司于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。
  Filter翻译为中文就是过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,可以对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

<br><br>

Filter的主要功能:

  在HttpServletRequest到达 Servlet 之前,会拦截客户的HttpServletRequest。也就是说在访问到Servlet之前会先访问到过滤器,所以这时就可以在过滤器中根据需要来检查HttpServletRequest中的数据,也可以修改HttpServletRequest 头和数据。
  在HttpServletResponse到达客户端之前,也可以拦截HttpServletResponse ,这种方式就是后处理。同样的可以在过滤器中根据需要来检查HttpServletResponse中的数据,也可以修改HttpServletResponse头和数据。
  因为过滤器可以做到以上的功能,所以可以应用在登录状态验证、权限验证、防止外站盗链等方面上。

<br><br>

编写简单的过滤器:

介绍完Filter过滤器后,我们就来看看如何编写一个过滤器吧,在Eclipse中过滤器可以直接在菜单栏中创建:
defaultServlet与Filter过滤器

<br>
也可以自己写一个普通的类,实现于Filter接口并配置web访问名称映射即可,首先介绍注解的配置方式:
defaultServlet与Filter过滤器
  图中的过滤器是作用于工程下所有的Servlet,应该说是所有的资源访问,包括其他各种静态资源,如果你想让此过滤器作用于某个目录下所有的Servlet,例如我要作用于admin下所有的Servlet和所有的静态资源访问,把注解的内容写成 /admin/ 就可以了,以下再介绍几个配置方式:
  /admin/login 仅作用于admin目录下的login Servlet
  /login 仅作用于工程目录下的login Servlet
  /
.jpg 作用于工程目录下所有的.jpg文件(其他文件以此类推)
  /image/timg.jpg 仅作用于image目录下的timg.jpg文件

<br>
  以上介绍完了过滤器使用注解的基本配置方式,然后我们写一个简单的Servlet来测试一下,看看访问是否会先经过过滤器:
defaultServlet与Filter过滤器

<br>
控制台打印结果:
defaultServlet与Filter过滤器
可以看到先执行了过滤器中的打印语句,然后才执行的Servlet中的打印语句。

<br>
现在我把过滤器中的doFilter方法的调用给注释掉,看看还能不能访问到这个Servlet:
defaultServlet与Filter过滤器
如图,并不能访问到Servlet,访问到过滤器上就结束了,所以可以很明显的看出这种特性可以做一些访问的验证。过滤器就像Servlet的保安一样,没有通过过滤器的允许就不能访问Servlet。

<br>
在web.xml中配置过滤器的语法:
defaultServlet与Filter过滤器
图中配置的过滤器,作用于image目录下的所有访问资源。

<br>
在一个工程中过滤器可以写任意个,如果好几个过滤器作用着同一个Servlet的话,那么想要访问到这个Servlet就得通过这些过滤器的允许才行,其中一个过滤器不允许也就是不调用doFilter方法的话,都无法访问到这个Servlet。这就好比追妹子一样,女追男隔层纱,男追女隔房隔车隔她妈,其中一个不过关都追不到妹子,说完我就自个new了个对象(手动滑稽)。

<br>
  我们可以使用过滤器来做一个简单的盗链过滤,所谓盗链就是从别人的网站、服务器上盗取一些访问资源,以引用的方式放到自己站点上,例如照片什么的。所以盗链和单纯下载别人网站的图片放到自己的服务器上有所不同,而是直接以引用的方式获取资源,也就是说资源依旧在他人的站点上,这样的话会大量损耗对方的网络带宽资源,并且对方还得不到任何的利益,就像是出力的是我,分钱又没我份。
  所以我们要使用过滤器实现这个防盗链的需求:只要是在别的网站访问过来的就不让他进行访问或引用,只有从本站点的页面进行访问的才能够访问。
代码示例:
defaultServlet与Filter过滤器

<br>
Jsp代码:
defaultServlet与Filter过滤器

<br>
浏览器访问:
defaultServlet与Filter过滤器

<br>
然后直接访问此图片的路径:
defaultServlet与Filter过滤器

<br>
可以看到以上从本站点访问都是正常的,然后看看从别的站点访问:
defaultServlet与Filter过滤器
结果如图,从别的站点访问就会显示禁止盗链的图片了。

转载于:https://blog.51cto.com/zero01/2044104

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java过滤器filters)是在处理请求和响应时对它们进行预处理和后处理的组件。在Java中,过滤器是使用Servlet API中的Filter接口实现的类。当编写的Java类实现了Filter接口时,它被称为过滤器Filter)。过滤器类可以在请求发送到Servlet容器之前执行一些操作或处理。 过滤器的执行顺序取决于过滤器的名称。在使用@WebFilter注解配置过滤器时,如果没有指定执行顺序的属性,它们将按照Filter类名的字母顺序倒序排列。注意,@WebFilter指定的过滤器优先级高于FilterRegistrationBean配置的过滤器。 通过使用过滤器,开发人员可以在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行自定义处理,例如记录请求的执行时间、验证请求的身份等。过滤器可以访问Servlet Context以及链接到其他过滤器。 总之,Java过滤器是用于预处理和后处理请求和响应的组件,它们通过实现Filter接口来实现,并可以在请求到达Servlet之前或响应离开Servlet之后执行一些操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java中的过滤器](https://blog.csdn.net/weixin_42561192/article/details/114883499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java中拦截器和过滤器详解](https://blog.csdn.net/yxg520s/article/details/122348512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值