Filter过滤器笔记

概念:对访问的目标资源的请求和响应进行拦截, web中的过滤器:当服务访问资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。


 过滤器的作用:一般用于完成通用的操作,如登录验证、统一编码处理、敏感字过滤等

1.创建拦截器流程
    1.实现 javax.servlet.Filter接口
    2.重写 init、doFilter、destroy方法
    3.配置拦截路径
        1使用web.xml配置
        2.使用注解配置

package com.xiaoqiang.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//@WebFilter("/*") // 注解配置 "/*"代表拦截所有请求
public class FiirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter被执行了。。。。。");
        filterChain.doFilter(servletRequest,servletResponse);//放行,继续执行请求
    }

    @Override
    public void destroy() {

    }
}

web.xml添加过滤器

    <filter>
        <filter-name>demo</filter-name><!--filter 名称-->
        <filter-class>com.xiaoqiang.filter.FiirstFilter</filter-class><!--filter 执行类地址-->
    </filter>
    <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>/*</url-pattern><!--配置拦截地址,/*表示拦截所有请求-->
    </filter-mapping>

2.过滤器执行流程
    1.拦截到servlet的请求
       在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,处理request消息
    2.处理请求
        判断是否允许通过请求
    3.拦截返回请求
        拦截servlet到请求端的响应,处理response

3.filter的生命周期
    init:服务启动的时候调用init方法创建filter,只执行一次,用于加载资源
    doFilter:服务被访问的时候执行,执行多次,每次被调用均会执行,用于执行拦截的逻辑
    destroy:服务正常关闭的时候执行,只执行一次,用于释放资源

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("服务启动调用init方法创建filter。。。。。");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter被执行了。。。。。");
        filterChain.doFilter(servletRequest,servletResponse);//放行,继续执行请求
        System.out.println("请求返回了。。。。");
    }
    @Override
    public void destroy() {
        System.out.println("服务关闭调用destroy销毁filter。。。。。");
    }

4.拦截器路径配置

        1.具体资源路径:只拦截配置的具体地址

                例如:/index.jsp,只有访问index.jsp资源时才会被拦截

        2.拦截目录:拦截配置的该路径的所有请求

                例如:/user/*,访问路径包含 user的都会被拦截

         3.后缀名拦截:拦截含有固定后缀的请求

                例如:/*.do,所有以.do结尾的请求都会被拦截

         4.拦截所有请求:/* 所有的请求都会被该拦截器请求

注解配置

@WebFilter("/*") // 注解配置 "/*"代表拦截所有请求
@WebFilter("*.do")//拦截以.do结尾的请求
@WebFilter("/user/*")//拦截user路径下的所有请求
@WebFilter("/index.jsp")//只拦截index.jsp

web.xml配置

<filter>
        <filter-name>demo</filter-name><!--filter 名称-->
        <filter-class>com.xiaoqiang.filter.FiirstFilter</filter-class><!--filter 执行类地址-->
    </filter>
    <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>/*</url-pattern><!--配置拦截地址,/*表示拦截所有请求-->
    </filter-mapping>
    <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>*.do</url-pattern><!--配置拦截地址,只拦截以.do结尾的请求-->
    </filter-mapping>
    <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>/user/*</url-pattern><!--配置拦截地址,拦截user路径下所有请求-->
    </filter-mapping>
    <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>/index.jsp</url-pattern><!--配置拦截地址,只拦截index.jsp-->
    </filter-mapping>

5.拦截不同方式请求的配置
    1.默认 REQUEST:拦截直接请求资源的请求
    2.FORWARD:拦截转发请求
    3.INCLUDE:包含访问资源
    4.ERROR:错误的跳转资源
    6.ASYNC:异步访问资源

注解:

package com.xiaoqiang.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//当正常访问资源才会被拦截(默认的dispatchTypes)
//@WebFilter(value = "/index.jap",dispatcherTypes = DispatcherType.REQUEST)
//转发访问资源时才会被拦截
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//正常访问和转发到index.jsp都会被拦截的配置
//@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
//配置成 /* 正常请求会被拦截一次,转发时还会在被拦截一次
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class TwoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("DispatcherType.FORWARD...........");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

       web.xml

 <filter-mapping>
        <filter-name>demo</filter-name>
        <url-pattern>/index.jsp</url-pattern><!--配置拦截地址,只拦截index.jsp-->
        <dispatcher>FORWARD</dispatcher><!--拦截访问类型-->
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

6.过滤器链(多个过滤器执行顺序)

        服务配置有多个过滤器是,请求时先执行的过滤器在返回时最后执行。

7.多个过滤器的执行顺序

        1.注解配置:按照类名的字符串比较规则比较,值小的先执行

                如AFilter 和Bfilter,就会先执行AFilter

        2.web.xml:  filter-mapping定义在上边谁就先执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值