0%

【JavaWeb】Filter

Filter过滤器学习


1 基本介绍

1.1 filter介绍

  • Filter:翻译为过滤器,是JavaEE的规范,也就是接口
  • Filter作用:拦截请求,过滤响应
  • 请求拦截场景
    • 权限检查
    • 日记操作
    • 事务管理

1.2 简单实现过滤器

  • (1)创建filter,实现接口Filter,重写doFilter()方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class AdminFilter implements Filter {
    /** 对拦截的请求进行过滤操作 */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 权限控制处理,例如判断session中是否有用户信息
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    Object user = request.getSession().getAttribute("user");
    if (user == null) {
    // 拦截并响应
    servletResponse.setContentType("text/html; charset=UTF-8");
    servletResponse.getWriter().write("你无权访问此资源!");
    return;
    }
    // 放行,向下一个过滤器执行
    filterChain.doFilter(servletRequest, servletResponse);
    }
    }
  • (2)web.xml配置过滤器,以及拦截路径
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <filter>
    <filter-name>adminFilter</filter-name>
    <filter-class>filter.AdminFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>adminFilter</filter-name>
    <!-- * :表示admin的子目录的所有资源(包括孙子目录)都拦截 -->
    <!-- url-pattern支持写多个 -->
    <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

1.3 注解实现

1
2
3
4
5
6
7
8
9
10
11
// 单个urlpatterns
@WebFilter(filterName = "AdminFilter", urlPatterns = "/admin/*")
public class AdminFilter implements Filter {
// .....
}

// 多个url-patterns
@WebFilter(filterName = "AdminFilter", urlPatterns = {"/admin/*", "/letere/*"})
public class AdminFilter implements Filter {
// .....
}

2 路径匹配

  • (1)精确匹配
  • 精确匹配访问资源的路径
  • /admin/nokopara.jpg:只拦截admin目录下的nokopara.jpg图片
  • (2)目录匹配
  • 匹配该目录下的所有资源
  • /admin/*:拦截admin目录下的所有资源
  • (3)后缀名匹配
  • 匹配指定后缀名的资源路径
  • *.jpg:拦截所有jpg后缀名的资源
  • 注意:后缀名匹配不能以/开头

3 多个过滤器执行顺序

  • (1)过滤器在web.xml配置
  • 按照web.xml配置的过滤器从上往下进行匹配,路径匹配成功,进行该过滤器的doFilter()方法
  • (2)过滤器在注解配置
  • 通过过滤器名字进行字母排序执行

4 生命周期


5 FilterConfig类

  • FilterConfig,能获取一些filter的配置信息
  • FilterConfig在public void init(FilterConfig filterConfig)的方法中