JavaWeb过滤器

序言:从今天开始慢慢复习Java基础

 

一:过滤器的简介

1.1 过滤器是什么

1:过滤器是javaweb中的三大组件之一,也就是说需要在web.xml中配置,也可以使用注解。

2:过滤器它能够对Servlet容器传给web组件中的ServletRequest和ServletResponse对象进行检查或者修改。比如过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容。

3:过滤器就像我们现实中的在窗户装一个过滤网,这样可以避免有蚊子进来,那么如果让蚊子进来呢?将那个过滤网的洞口变大一点,那么蚊子就可以进来了。

4:过滤器它会在一组资源(jsp、servlet、.css、.html等等)的前面执行, 它可以让请求得到目标资源,也可以不让请求达到。

 

1.2 使用过滤器的好处

 

A:通过一个现实的例子:在没有使用过滤器之前,我举例生活中的一个例子,比如 某某公司,分配了好多个部门,每个部门门口前面都有一个保安来检查你是不是该公司的人,如果是,那么你就可以进去。 如果我们使用这种方式的话,那么一个公司就得多请几个保安,这样导致总是重复一些劳动,降低了保安的检查工作的效率。

那么如果我们使用过滤器的话,就好比你在公司的大门面前,安排一个保安来检查是否是该公司的人,如果是,就放他进该公司,这样会大大提高保安的工作效率,而且还能减少重复劳动力,只需要请一个保安。

B:当多个web组件中编写同样操作的代码,那么我们可以将各个组件的相同操作可以放在同个过滤器中来完成,从而提高开发的效率。

二: Filter的API

void init(FilterConfig)
  * 创建之后,马上执行;Filter会在服务器启动时就创建!
void destory()
  * 销毁之前执行!在服务器关闭时销毁
void doFilter(ServletRequest,ServletResponse,FilterChain)
  * 每次过滤时都会执行
二个对象:
FilterConfig(这个对象就类似当初学ServletConfig的时候)
getInitparamer
*获取初始化参数
getFilterName
*获取配置名称
getServletContext
*获取配置的值
FilterChain(这个东西比较重要)
*doFilter
作用:这个东西其实就决定了整个Filter,该方法决定了是否放行下一个过滤器执行(如果没有过滤器的话,那么执行目标资源)。

三:过滤器快速入门

3.1步骤

3.1.1 实现Filter接口

因为Filter不是ServletRequest或者ServletResponse中的对象,所以我们只需要直接用java的方式实现Filter接口

3.1.2 部署web.xml

这个东西的部署跟Servlet的部署是一样的,只是把将Servle的名字改为Filter

 
   <servlet>                                                         <filter>
     <servlet-name>类名</servlet-name>                                  <filter-name>类名</filter-name>
      <servlet-class>包名.类名</servlet-class>                           <filter-class>包名.类名</filter-class>
   </servlet>                                                        </filter>
   <servlet-mapping>                                                     <filter-mapping>
     <servlet-name>类名</servlet-name>                                <filter-name>类名</filter-name>
     <url-pattern>/类名</url-pattern>                                 <url-pattern>拦截的资源</url-pattern>
   </servlet-mapping>                                                    <dispatcher>REQUEST</dispatcher>默认的!还有三个                                                                          值FORWARD,INCLUDE,ERROR
                                                                         </filter-mapping>
View Code

3.1.3  快速入门案例代码

1   <servlet>                                                             <filter>
2     <servlet-name>AServlet</servlet-name>                                <filter-name>类名</filter-name>
3      <servlet-class>cn.itcast.web.AServlet.AServlet</servlet-class>      <filter-class>包名.类名</filter-class>
4   </servlet>                                                            </filter>
5   <servlet-mapping>                                                     <filter-mapping>
6     <servlet-name>AServlet</servlet-name>                                <filter-name>类名</filter-name>
7     <url-pattern>/AServlet</url-pattern>                                 <url-pattern>拦截的资源</url-pattern>
8   </servlet-mapping>                                                    <dispatcher>REQUEST</dispatcher>默认的!还有三个                                                                          值FORWARD,INCLUDE,ERROR
9                                                                         </filter-mapping>
View Code

效果图:

四:Filter执行顺序

前面我们说过,FilterChain中有个方法(doFilter)及其重要,它能够决定整个doFilter,因为它能够决定你是否能够执行下一个过滤器(如果没有过滤器的话,那么直接执行目标资源)。

那么问题来了,当有多个过滤器的话,那么Filter的执行顺序是怎么样的?

4.1  多个过滤器执行顺序

当一个目标有多个过滤器执行顺序的时候,那么他的执行顺序是根据xml的中的位置,来执行过滤器的,

那么如果当中有涉及到放行呢? 那么流程可以这样记 当你去姥姥家取水果的时候,会先经过匪徒A再经过匪徒B,如果当你去的时候,他们会放你过去 那么会经过AB,回来的就从先经过B再经过A。

public class MyFilter1 extends HttpFilter {
    public void doFilter(HttpServletRequest request, HttpServletResponse response,
           FilterChain chain) throws IOException, ServletException {
       System.out.println("filter1 start...");
       chain.doFilter(request, response);//放行,执行MyFilter2的doFilter()方法
       System.out.println("filter1 end...");
    }
}
public class MyFilter2 extends HttpFilter {
    public void doFilter(HttpServletRequest request, HttpServletResponse response,
           FilterChain chain) throws IOException, ServletException {
       System.out.println("filter2 start...");
       chain.doFilter(request, response);//放行,执行目标资源
       System.out.println("filter2 end...");
    }
}
  <body>
    This is my JSP page.
 
    <h1>index.jsp</h1>
    <%System.out.println("index.jsp"); %>
  </body>
 
当用户访问index.jsp的时候,输出的结果:
filter1 start...
filter2 start...
index.jsp
filter2 end...
filter1 end...
View Code

五:Filter 拦截方式

附上 dispatcher 的可选值及说明

可选值
说明
REQUEST
当客户端直接请求时,通过过滤器进行处理
INCLUDE
当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
FORWARD
当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
ERROR
当声明式异常产生时,通过过滤器进行处理
 

六:过滤器的应用场景

过滤器的应用场景:

* 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;

* 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;

* 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;

 
 
原文地址:https://www.cnblogs.com/Yzengxin/p/11204486.html