当前位置: 首页 > 科技观察

Servlet过滤器浅析

时间:2023-03-16 18:26:29 科技观察

本文转载自微信公众号《码工是小西》,作者小西。转载本文请联系码工小希公众号。1定义Servletfilter和Servlet很相似,注意它有拦截客户端请求的用法,Servletfilter可以改变请求的内容以满足实际开发的需要。从开发上来说,过滤器本质上是web应用服务器中的一个web组件,用于拦截来自客户端(浏览器)和目标资源的请求,经过一定的过滤处理后将这些请求发送给目标资源:from图中可以看出,web容器部署了过滤器后,不仅客户端发送的请求会被过滤器处理,而是应该返回吗?是的,请求的响应信息也需要通过过滤器。如果在Web应用中使用一个过滤器不能解决实际业务需求,可以部署多个过滤器多次处理业务请求。这将形成一个过滤器链。Web容器在处理过滤器时,会按照过滤器的先后顺序处理过滤请求:过滤器链部署在Web服务器中,一次会按照过滤器的顺序处理请求。第一个过滤器处理完一个请求后,会传递给第二个过滤器进行处理。以此类推,直到通过最后一个过滤器,然后将请求交给目标资源进行处理。目标资源处理过滤后的请求后,其响应信息从最后一个过滤器依次传递到第一个过滤器,最后发送给客户端;2过滤器核心对象过滤器对象放在javax.servlet包中,叫做Filter,它是一个接口,与过滤器相关的对象包括FilterConfig对象和FilterChain对象,也是接口对象。它们位于javax.servlet包中,分别作为过滤器的配置对象和过滤器的传递工具。在实际开发中,定义一个过滤器对象只需要直接或间接实现Filter接口即可。下图中的MyFilter1过滤器和MyFilter2过滤器,过滤器的相关操作使用了FilterConfig对象和FilterChain对象:Filter接口每个过滤器对象只是直接或间接实现了Filter接口,在Filter中定义了三个方法接口,分别为init()、doFilter()和destroy(),如表所示:FilterChainchain)throwsIOException,ServletExceptionFilter请求publicvoiddestroy()Destroy方法释放资源如表所示:方法说明publicStringgetFilterName()用于获取过滤器的名称publicServletContextgetServletContext()获取ServletcontextpublicStringgetInitParameter(Stringname)已获取过滤器的初始化参数值publicEnumerationgetInitParameterNames()获取过滤器的所有初始化参数。FilterChain接口由Servlet容器实现。在这个接口中,有一个方法,其方法声明为:publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse)throwsIOException,ServletException这个方法将过滤后的请求传递给下一个过滤器,如果这个过滤器已经是过滤器链中的最后一个过滤器,然后将请求传递给目标资源过滤器的创建基于配置要创建过滤器对象,您需要实现javax.serjavax.servlet.Filter接口。下面演示过滤器的创建:创建一个名为MyFilter的过滤器对象:importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;导入javax.servletFilterConfig;导入javax.servlet.ServletException;importjavax.servlet.ServletRequest;导入javax.servlet.ServletResponse;Processing}//过滤处理方法publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletEXException{//过滤处理chain.doFilter(request,response);}//销毁方法publicvoiddestroy(){//释放资源}}filterinit()处理filter的初始化,destroy()是filter的销毁方法,主要是释放资源。对于filter处理的业务,需要写在doFilter()中,链参数doFilter()将请求向下传递给下一个filter或者目标资源:使用filter不一定将请求传递给下一个filterortargetresource,如果业务逻辑需要,也可以过滤后直接响应Client;过滤器也非常类似于Servlet。它们也是在创建后配置的。过滤器的配置主要分为两步,分别是声明过滤器对象和创建过滤器映射,创建一个名为MyFilter的过滤器对象:MyFiltercom.lyq.MyilterMyFilter