过滤器基础知识学习

过滤器学习笔记

Filter过滤器简介

  • 过滤器(Filter)是J2EE Servlet模块下的组件
    Filter的作用是对URI进行统一的拦截处理
    Filter通常用于应用程序层面进行请求的前置处理

开发Filter过滤器

  • 任何过滤器都要实现javax.servlet.Filter接口
    在Filter接口的doFilter()方法中编写过滤器的功能代码
    在web.xml中对过滤器进行配置,定义拦截URI的范围
<filter>
        <filter-name>firstFilter</filter-name>
        <filter-class>com.imooc.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>firstFilter</filter-name>
        <!-- /* 对所有请求进行拦截 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器已生效");
        // 将请求响应向后传递,被后续的Filter或者servlet进行处理
        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

Filter过滤器的生命周期

  • Filter.init()在服务器应用程序启动时执行
    注:Servlet是在第一次处理请求时初始化
    Filter.destory()在服务器程序停止时执行

注解配置过滤器

  • @WebFilter (filterName=“annotationFilter”,urlPatterns=“/*”, initParams = {
    @WebInitParam(name = “encoding”, value = “UTF-8”),
    @WebInitParam(name = “p1”, value = “v1”),
    @WebInitParam(name = “p2”, value = “v2”)
    })

过滤器处理字符集乱码问题

  • GET请求-server.xml增加URlEncoding=“UTF-8”
    POST请求-使用request.setCharacterEncoding(“UTF-8”)
    响应-response.setContentType(“text/html; charset=UTF-8”)
    过滤器参数化
    过滤器为了增强灵活性,允许配置信息放在web.xml
    在web.xml中配置<init-param>设置过滤器参数
public class CharacterEncodingFilter implements Filter {
    private String encoding;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("encoding");
        System.out.println("enconding:" + encoding);

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // HttpServletRequest接口是继承自ServletRequest接口,进行类型转换处理字符集
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        req.setCharacterEncoding(encoding);
        resp.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }

}
<filter>
        <filter-name>charsetEncodingFilter</filter-name>
        <filter-class>com.imooc.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
     <filter-mapping>
        <filter-name>charsetEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

url-pattern常用方法

  • /index.html - 执行资源精准匹配
    /servlet/* - 以前缀进行模糊匹配
    *.html - 以后缀进行模糊匹配
  • /和/*的区别:
    /应用在Servlet配置,使该Servlet替代主页
    *应用在过滤器,代表对所有请求拦截

过滤链

  • 每一个过滤器应具有单独职能
    过滤器的执行顺序以<filter-mapping>为准
    调用chain.doFilter()将请求向后传递
    注解形式的过滤器链是按照过滤器的类名的字母升序的顺序依次执行

过滤器多端设备自动匹配

public class DeviceAdapterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @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(); // /index.html -> /mobile/index.html
        String userAgent = req.getHeader("user-agent");
        System.out.println(userAgent);
        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.setContentType("text/html;charset=utf-8");
        resp.sendRedirect(targetUri);
    }
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
<filter>
        <filter-name>deviceAdapterFilter</filter-name>
        <filter-class>com.imooc.filter.DeviceAdapterFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>deviceAdapterFilter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>

监听器Listener

  • 监听器(Listener)是J2EE Servlet模块下的组件
    Listener的作用对Web应用对象的行为进行监控
    通过Listener监听自动触发指定的功能代码
    过滤器(Filter)的职责是对URL进行过滤拦截,是主动的执行
    监听器(Listener)的职责是对Web对象进行监听,是被动触发
    ServletContext -对全局ServletContext及其属性进行监听
    HttpSession -对用户会话及其属性操作进行监听
    ServletRequest -对请求及属性操作进行监听
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值