过滤器的作用不论是在前端和后端都存在非常重要的作用,但是其实现还是非常简单的。原理图:
[图片上传失败...(image-9de27e-1551666962606)]
在开发中过滤器有有一个什么样的角色?
在实际开发与前端对接时,前端开发者传输过来的数据一般是UTF-8格式的,而JSP中却不是这种默认格式。因此,我们需要将数据和页面格式相匹配。
但是,后端服务中不可能说只有一个控制器。在View与Controller的交互中,往往非常多的请求服务页面,因此如果每个页面都去设置一个设置编码语句,不久造成不必要的代码重复了吗?因此过滤器在其中扮演着规则的角色。我制定的规则,在我过滤的范围内都需要执行。
过滤器API
只需要实现Filter接口,和它的三个生命周期方法就能够使用了
其中init()和destory()和Servlet一样的作用。其中的精髓还是在于doFilter方法,它有三个参数ServletRequest,ServletResponse,FilterChain,前面两个都很熟悉,而FilterChain非常陌生那么它是什么呢?
FilterChain????
我们看一下它的源码:
public interface FilterChain {
void doFilter(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws java.io.IOException, javax.servlet.ServletException;
}
看的出,它是一个interface接口。里面依旧是两个参数ServletRequest,ServletResponse。
其实在一个企业级项目中往往存在非常多的过滤器,比如在过滤编码的同时,还需要过滤登录状态,然后也需要过滤一些关键字......等等非常多过滤需求,一层一层过滤下去
[图片上传失败...(image-403c27-1551666962606)]
可以看的到,第一个过滤器执行了,如果碰到FilterChain的话会执行第二个过滤器,当执行完所有过滤操作后,从内向外依次关闭。
Filter的配置
有两种方法可以配置Filter,第一种是web.xml配置路径,范围,默认值,
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1</filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name>子元素用于设置filter的注册名称。**该值必须是在元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)**
<servlet-name>指定过滤器所拦截的Servlet名称**。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个
<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
第二种是通过注解:
@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")
过滤器是一个非常常见的东西,但是用处也是非常大的。
网友评论