filter对象能够改变请求和响应的头信息和内容信息。过滤器和web组件的不一样之处在于,过滤器一般不会自行建立响应。做为替代,过滤器提供附加到任意类型的web资源的功能。所以,过滤器不应对要过滤的web资源有任何依赖。这样,它能够由多种web资源组成。
过滤器能够执行的主要任务以下:java
应用程序的过滤器包含认证、日志、图片转换、数据压缩、数据加密、标记流、xml转换等。
你能够给一个web资源配置0-多个过滤器,而且能够自定义过滤器的顺序。过滤器链在包含此组件的web资源部署时指定,而且在web容器加载的时候实例化。web
filtering api定义在javax.servlet包中的Filter, FilterChain, and FilterConfig接口中。你能够经过实现Filter接口定义一个过滤器。
使用@WebFilter注解在web程序中定义过滤器。这个注解做用在类上,而且包含过滤器的元数据。过滤器注解必须定义至少一个url匹配,经过使用z注解的urlPatterns或value属性完成这个操做。全部其余的属性都是可选的,有默认设置。当只有一个url规则时使用value注解;当有多个url规则或须要自定义属性时使用urlPatterns注解。
使用@WebFilter 注解的类必须实现 javax.servlet.Filter 接口。
要将配置数据添加到过滤器中,可使用@WebFilter注解的initParams属性。initParams属性包含一个 @WebInitParam 注解。下面的代码片断定义了一个过滤器,定义了一个初始化参数:api
import javax.servlet.Filter; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; @WebFilter(filterName = "TimeOfDayFilter", urlPatterns = {"/*"}, initParams = { @WebInitParam(name = "mood", value = "awake")}) public class TimeOfDayFilter implements Filter { ...
Filter接口的最重要的方法是doFilter,这个方法能够执行下列操做:app
执行doFilter,你必须实现init和destroy方法。init方法在web容器实例化的时候调用;若是你想给filter传入初始化参数,能够经过传入init方法的FilterConfig参数获取它们。异步
过滤器有多种方式去修改请求和响应。例如,一个过滤器能够向请求添加一个参数或者在响应中插入数据。
过滤器修改响应必须在响应返回客户端以前捕获响应。为此, 您将一个替代流传递给生成响应的servlet。备用流阻止servlet在完成时关闭原始响应流,并容许过滤器修改servlet的响应。
要将此替换流传递给servlet,过滤器会建立一个响应包装器,它会覆盖getWriter或getOutputStream方法以返回此替换流。这个包装器经过过滤器链doFilter方法传递。包装器方法默认调用包装的请求或响应对象。
重写请求方法,你包装的请求必须继承ServletRequestWrapper或HttpServletRequestWrapper。重写响应方法,你的响应必须继承ServletResponseWrapper or HttpServletResponseWrapper。async
web容器使用请求映射决定给web资源应用具体的过滤器。过滤器映射使用名称映射一个过滤器到web组件或者使用url规则匹配到web资源。过滤器按照war中定义的顺序执行。您可使用NetBeans IDE或使用XML手动编写列表来为其部署描述符中的WAR指定过滤器映射列表。
若是你想记录每个到web应用的请求,你能够将过滤器映射到url规则“/”。
能够映射filter到一个或多个web资源,固然你也能够给一个web资源映射多个filter。参见下图,F1映射到S一、S二、S3,F2映射到S2,F3映射到S一、S2.
再次强调,filter chain是传入filter的doFilter方法的一个参数。该链经过过滤器映射间接生成。链中的过滤器顺序与过滤器映射在Web应用程序部署描述符中的显示顺序相同。当一个过滤器映射到S1,web容器调用F1的doFilter方法。S1的过滤器链中每一个过滤器的doFilter方法由链中的前一个过滤器经过chain.doFilter方法调用。由于S1的过滤器链包含过滤器F1和F3,因此F1对chain.doFilter的调用会调用过滤器F3的doFilter方法。 当F3的doFilter方法完成时,控制返回F1的doFilter方法。加密
a. 展开Filter Mappings节点
b. 从filterlist中选择一个filter
c. 点击add
d. 在添加映射弹窗,须要选择一个转发类型:url
经过选择多个调度程序类型,能够指示过滤器应用于上述状况的任意组合。 若是未指定类型,则默认选项为REQUESTspa