Servlet Filter

来源:互联网 发布:淘宝ysl口红真假 编辑:程序博客网 时间:2024/06/06 04:37

Servlet API中提供了一个Filter接口,如果编写的Java类实现了这个接口,则把这个java类称为过滤器。通过过滤器,可以实现访问某个目标资源之前,对访问的请求和响应进行拦截。

编写java类实现fiter接口,需要实现其doFitler接口。在web.xml中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

web服务器根据Filter在web.xml文件中注册顺序,决定先调用哪个Filter。

Filter的生周期:

1)init(FilterConfig filterConfig)throws ServletException:

和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法进行初始化(注:filter对象只会创建一次,init方法也只会执行一次。示例 )

开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

(2)doFilter(ServletRequest,ServletResponse,FilterChain)

每次filter进行拦截都会执行

在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作

(3)destroy():

在Web容器卸载 Filter 对象之前被调用。

映射Filter

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

(1)<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

(2)<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

(3)<servlet-name>指定过滤器所拦截的Servlet名称。

(4)<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

(5)<filter-mapping> 过滤器拦截配置


如果连接目标资源是一个Servlet,可以选择url和servlet名称两种配置方式

<!-- 拦截/hello是Servlet 路径 -->

<url-pattern>/hello</url-pattern>

<!-- 拦截Servlet 还可以通过Servlet 名称进行拦截 -->

<servlet-name>HelloServlet</servlet-name>

(6)url-pattern 和 Servlet中路径写法一样,有三种 : 完全匹配、目录匹配、扩展名匹配

(7)<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式

容器调用服务器端资源 有四种方式

REQUEST、FORWARD、INCLUDE、ERROR

 

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

 

filter可以接受一些参数,init-param的param-name就是参数名,param-value就是参数值,支持多个参数,每一个filter都有一个init方法,可以在这个方法中通过getInitParameter("key"),key就是param-name的值,来获取对应的参数值。

 

 

0 0
原创粉丝点击