【笔记整理】之filter过滤器

filter过滤器 

 1、什么是过滤器:

    1、对servlet的请求/响应进行一些额外操作或者处理,包括获取信息、添加信息、拦截
  2、一个filter过滤器可以对应于一个或者多个servlet
  3、请求servlet或者响应到前台之前 先要经过servlet过滤器
  也就是servlet容器在调用service()方法前调用doFilter()进行一些操作,并决定是否进行chain.doFilter()继续操作

2、编写一个filter

  过滤器实现了 javax.servlet.Filter 接口的 Java类. 有三个方法:
  1、void init(FilterConfig filterConfig)
    web容器启动时候遍历 web部署描述符 进行过滤器初始化,只执行初始化一次
    通过filterConfig可以获取filter配置的init-param参数
    filterConfig.getInitParam("site"); ""里为param-name
  2、void doFilter(ServletRequest, ServletResponse, FilterChain)
    FilterChain接口只有一个方法:doFilter(ServletRequest, ServletResponse)
    作用是把web容器当前请求交给下一个过滤器或者servlet处理,如果没有调用FilterChain的doFilter方法 则该请求停止在此过滤器不会继续执行
  3、void destroy()
    过滤器实例回收前进行的资源回收操作.

public class filter implements Filter {

    /**
     * 容器启动时候初始化一次
     */
    @Override
    public void init(FilterConfig config) {
        System.out.println("init  " + config.getInitParameter("name"));
        config.getFilterName();
        config.getInitParameterNames();
        config.getServletContext();
    }
    
    /**
     * 过滤器过滤处理操作,每次请求都处理;
     * chain为链子,链接所有过滤器;
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        System.out.println("doFilter1");
        try {
            chain.doFilter(request, response);
        } catch (IOException | ServletException e) {
            // TODO Auto-generated catch block
            System.out.println("error" + e.getMessage());
        }
    }
    
    /**
     * 资源回收
     */
    @Override
    public void destroy() {
        
    }
}

3、配置filter

  1、web.xml叫做web部署描述符,声明一些约定、规定的配置文件. 

  2、当web容器启动时候,会为web.xml(部署描述符)中配置的每一个过滤器启动一个实例.

  3、过滤器配置在 web.xml(部署描述符)里.跟servlet格式差不多
    一般将过滤器放在servlet前面

<filter>
    <filter-name>test</filter-name>
    <filter-class>filter</filter-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>test</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>test</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

   4、过滤器执行顺序跟web部署描述符里配置顺序有关,<filter-mapping>在前先配置的过滤器会先执行,某个请求的所有匹配的过滤器、servlet构成一条过滤链

4、一些说明

  1、filter的init()初始化操作在tomcat完全启动之前就执行了

  2、如果//chain.doFilter(request, response); 注释掉了 请求这个地址时候,不会有进一步动作, 但是请求对应的servlet的初始化操作会先于过滤器doFilter之前执行
  3、关于<filter-mapping>节点下对应的servlet配置补充
    除了上面通过url-patten匹配servlet之外,还可以通过servlet-name匹配对应的servlet,同时servlet2.4新增dispatcher节点

<filter-mapping>
  <filter-name></filter-name>
  <servlet-name></servlet-name>
  <dispatcher></dispatcher> 
</filter-mapping>

  dispatcher 分配调度 必须在filter-mapping最后,且在servlet-name或url-pattern后面,将请求分为4个类型,只有匹配上的类型才可以执行次过滤器
    * REQUEST 正常请求(有几次执行几次),也是默认值
    * INCLUDE  引入<jsp:include page="../modules/common/archive.jsp"></jsp:include>
    * FORWARD 必须是转发,且出错跳转的不算在内
    * ERROR 是触发error由error-page跳转过来的时候,但是这个不触发forward
      

<error-page>
    <error-code>500</error-code>
    <location>/filter/error.jsp</location>
</error-page>

  4、关于转发与重定向对比

 

  转发 重定向
客户端发起请求次数 1次 2次
客户端URL是否变化 不变 变为重定向后的URL
是否可以跨站点请求 不可以 可以
响应速度 相对快 相对慢
发起跳转 后端直接跳转 后端响应http code为3xx,前端重新发起请求

  实现方式: 

//跳转
request.getRequestDispatcher("http://localhost:8777/hello/form").forward(request, response);
//重定向 response.sendRedirct("https://www.cnblogs.com/");
posted @ 2019-03-10 11:42  空知大仙人  阅读(339)  评论(0编辑  收藏  举报