Filter过滤器

过滤器是J2EE Servlet模块下的组件,用来对URI进行统一的拦截处理,应用在请求的前置处理上。

过滤链拦截流程:

开发过滤器的三大步骤:

  1. 实现javax.servlet.Filter接口
  2. 实现Filter接口的doFilter()方法编写过滤器功能
  3. 在web.xml中配置过滤器,定义拦截URI的范围

    Filter过滤器_第1张图片

过滤器的生命周期:

  1. 初始化,Filter.init()
  2. 提供服务,Filter.doFilter()
  3. 销毁,Filter.destroy()

过滤器对象在服务器启动时就完成了初始化和实例化,且全局唯一,并发环境采用单例多线程的工作模式。

过滤器的两种配置形式:

  1. web.xml中配置filter(全局过滤最好使用该形式)
    Filter过滤器_第2张图片

  2. 注解形式配置filter,@WebFilter(filterName="XX",urlPatterns="/XX")
    Filter过滤器_第3张图片

字符集过滤器应用:
Filter过滤器_第4张图片

改进—过滤器参数化

Filter过滤器_第5张图片
Filter过滤器_第6张图片

url-pattern的常用写法:

  • 精准匹配,如/index.html
  • 前缀模糊匹配,如/servlet/*
  • 后缀模糊匹配,如*.html

//*的区别:

  • /应用在Servlet配置,代表默认首页
  • /*应用在过滤器,代表拦截所有请求

过滤链开发注意事项:

  • 每个过滤器具有单独职能
  • 过滤器执行顺序以为准
  • 调用filterChain.doFilter()将请求向后传递

过滤器实现多端设备自动匹配:

	@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) servletRequest;
        HttpServletResponse resp=(HttpServletResponse) servletResponse;

        String uri = req.getRequestURI(); //http才有的方法
        String userAgent = req.getHeader("User-Agent");
        String targetUri=null;
        if(uri.startsWith("/desktop") || uri.startsWith("/mobile")){
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            if(userAgent.toLowerCase().indexOf("android")!=-1 || userAgent.toLowerCase().indexOf("iphone")!=-1){
                targetUri="/mobile"+uri;
            }else{
                targetUri="/desktop"+uri;
            }
            resp.sendRedirect(targetUri);
        }

    }

监听器-Listener

是J2EE Servlet模块下的组件,对Web应用对象的行为进行监控,通过Listener监听自动触发指定的功能代码

过滤器和监听器的区别:

  • 过滤器对URL进行过滤拦截,是主动执行的
  • 监听器对Web对象进行监听,是被动触发对

监听器可以监听的三种对象:

  • ServletContext
  • HttpSession
  • ServletRequest

Filter过滤器_第7张图片
Filter过滤器_第8张图片

你可能感兴趣的:(JavaWeb,filter)