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:
<br>
DefaultServlet就配置在这个文件中:
如图,我们可以看到这个Servlet类所在的路径是org.apache.catalina.servlets.DefaultServlet,并且启动等级是1,也就是说服务器启动的时候这个Servlet就被加载了。
然后往下拉,可以找到DefaultServlet映射的web访问名称:
DefaultServlet映射的web访问名称是“/”(根),所以除了指定的Servlet外的所有资源请求最终都会访问到DefaultServlet上。
也就是说我们访问web服务器的时候只要不是访问其他Servlet的话,就会访问到这个DefaultServlet上。
我们也可以自己重写这个DefaultServlet,把web访问名称声明为“/”就可以了,代码示例:
<br>
然后我在浏览器中随便访问一些不存在的文件:
如图,可以看到全部的请求都访问到这个Servlet上了,只要没有匹配指定的Servlet的请求,都会访问到这里来,即便是请求一个不存在的资源。
<br>
例如我再创建一个Servlet:
<br>
在浏览器中访问这个Servlet后控制台的打印结果:
<br>
然后我访问这个Servlet下不存在的文件资源:
如图,可以看到访问到了DefaultServlet上,从这个实验可以看出只要没有被指定的Servlet处理的访问请求,都会访问到DefaultServlet上,不管这个访问的资源是否存在,但是有一点要注意的是:.jsp文件的访问请求不会被DefaultServlet所拦截,因为jsp已经有在Tomcat的web.xml文件中配置web访问名称了。
<br>
综上所述DefaultServlet最主要的一点还是可以用于管理静态资源,我们可以通过DefaultServlet去优化静态资源的访问速度。例如:在服务端上将访问过的静态资源缓存到内存中,客户端请求同一个资源的时候就可以直接在内存中输出,不用再去磁盘上读取,我们都知道内存的速度要比磁盘快很多,所以这种方式可以使访问速度提升。除此之外,我们还要设置一下静态资源的过期时间,让这个资源可以在一定的时间内缓存在用户的浏览器中,免得每次访问都需要请求服务器,增加服务器的压力。这种形式可以在Spring MVC框架中得到较好的实现,不过我们也可以自己手写一个基于这种原理的简单优化,代码示例:
<br>
我们来看看第一次访问此图片的速度:
<br>
第二次进行访问:
可以看到,速度快了一半以上,虽然单独这样一张图片好像提升不大,但是一般的网页都是会向服务器下载几十上百个静态资源的,在资源量大的情况下就会发现访问速度提升了。
<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中过滤器可以直接在菜单栏中创建:
<br>
也可以自己写一个普通的类,实现于Filter接口并配置web访问名称映射即可,首先介绍注解的配置方式:
图中的过滤器是作用于工程下所有的Servlet,应该说是所有的资源访问,包括其他各种静态资源,如果你想让此过滤器作用于某个目录下所有的Servlet,例如我要作用于admin下所有的Servlet和所有的静态资源访问,把注解的内容写成 /admin/ 就可以了,以下再介绍几个配置方式:
/admin/login 仅作用于admin目录下的login Servlet
/login 仅作用于工程目录下的login Servlet
/.jpg 作用于工程目录下所有的.jpg文件(其他文件以此类推)
/image/timg.jpg 仅作用于image目录下的timg.jpg文件
<br>
以上介绍完了过滤器使用注解的基本配置方式,然后我们写一个简单的Servlet来测试一下,看看访问是否会先经过过滤器:
<br>
控制台打印结果:
可以看到先执行了过滤器中的打印语句,然后才执行的Servlet中的打印语句。
<br>
现在我把过滤器中的doFilter方法的调用给注释掉,看看还能不能访问到这个Servlet:
如图,并不能访问到Servlet,访问到过滤器上就结束了,所以可以很明显的看出这种特性可以做一些访问的验证。过滤器就像Servlet的保安一样,没有通过过滤器的允许就不能访问Servlet。
<br>
在web.xml中配置过滤器的语法:
图中配置的过滤器,作用于image目录下的所有访问资源。
<br>
在一个工程中过滤器可以写任意个,如果好几个过滤器作用着同一个Servlet的话,那么想要访问到这个Servlet就得通过这些过滤器的允许才行,其中一个过滤器不允许也就是不调用doFilter方法的话,都无法访问到这个Servlet。这就好比追妹子一样,女追男隔层纱,男追女隔房隔车隔她妈,其中一个不过关都追不到妹子,说完我就自个new了个对象(手动滑稽)。
<br>
我们可以使用过滤器来做一个简单的盗链过滤,所谓盗链就是从别人的网站、服务器上盗取一些访问资源,以引用的方式放到自己站点上,例如照片什么的。所以盗链和单纯下载别人网站的图片放到自己的服务器上有所不同,而是直接以引用的方式获取资源,也就是说资源依旧在他人的站点上,这样的话会大量损耗对方的网络带宽资源,并且对方还得不到任何的利益,就像是出力的是我,分钱又没我份。
所以我们要使用过滤器实现这个防盗链的需求:只要是在别的网站访问过来的就不让他进行访问或引用,只有从本站点的页面进行访问的才能够访问。
代码示例:
<br>
Jsp代码:
<br>
浏览器访问:
<br>
然后直接访问此图片的路径:
<br>
可以看到以上从本站点访问都是正常的,然后看看从别的站点访问:
结果如图,从别的站点访问就会显示禁止盗链的图片了。
转载于:https://blog.51cto.com/zero01/2044104