最近在学习JAVAWEB相关的内容,学习过servlet之后现在在学习过滤器,以下是我对filter过滤器的理解。
顾名思义,过滤器就是一个用来过滤某些东西的机器。就好像我们生活中的漏斗一样,将需要的留下并收集起来用作它途,将不需要的过滤下去再进行其他处理,比如可以将这些过滤掉的东西直接丢掉。它的中心作用就是‘过滤’!它有权选择要过滤的东西和对过滤之后的东西如何进行处理。具体到java中的过滤器,它的具体功能就是对servlet容器调用servlet的过程进行拦截,包括请求和响应的过程都可以进行拦截。这个filter同servlet一样,都是由servlet容器进行调用和执行的。
那么,我们怎样在代码中创建一个满足自己需求的过滤器呢?
首先,我们需要创建一个自己的Filter实现类,它继承了javax.servlet.Filter这个接口。且必须实现这个接口的三个方法。类似于servlet。
1.init(FilterConfig)
这个方法是在servlet容器初始化这个filter类实例之后就被调用,其中的FilterConfig参数可获取在web.xml中配置的这个filter的所有的相关信息。
2.doFilter(ServletRequest,ServletResponse,FilterChain)
这个方法在初始化之后被调用,使我们实现这个filter中真正实现我们业务代码的部分。
为了便于我们获取一些请求的参数和调用方法,我们可以将ServletRequest和ServletResponse封装成HttpServletRequest和HttpServletResponse。
第三个参数FilterChain是过滤器中和Servlet不一样的地方,他代表着一个链条,这个链条将多个filter链在了一起。这个链条中的过滤器的过滤顺序是按照在web.xml中配置mapping的顺序来过滤的。而且,当一个过滤器起作用后,必须执行这个filterChain.doFilter方法释放这个过滤器,他才会接着传递到下一个过滤器进行过滤。
3.destroy()
当这个filter实例被销毁前进行调用。
此外,filter和servlet除了filterchain这一点不同之外,servlet还有几个封装的实现类可以使用,如HttpServlet何GenericServlet,而filter却没有它具体的实现类和接口,需要我们自己封装一个类似于HttpFilter的实现类供我们以后使用。
创建好Filter的实现类之后,我们需要在web.xml文件中配置以下我们的过滤器要过滤的内容。
1.<filter>
<filter-name>此处给过滤器起一个名字</filter-name>
<filter-class>此处写过滤器实现类的全类名</filter-class>
<init-param>
<param-name>此处填写该过滤器初始化参数的名称</param-name>
<param-value>此处填写该过滤器初始化参数的值</param-value>
</init-param>
</filter>
2.<filter-mapping>
<filter-name>此处用上边起过的名字</filter-name>
<url-mapping>此处写我们需要过滤哪些URL请求</url-mapping>
<dispacher>REQUEST,FORWORDMINCLUDE.ERROE</dispacher>
<!-- 上边的dispacher节点代表这个过滤器对什么类型的请求方式进行拦截,request表示直接访问时过滤器起作用(默认),forword表示目标资源通过forword时起作用 -->
</filter-mapping>
创建好过滤器类之后,我们还可以学习一些filter类的典型应用。如浏览器不缓存页面,字符编码的过滤器,检测用户是否登录的过滤器,权限管理的过滤器等等。
以上是我对过滤器的理解,欢迎咨询和指导。