栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Filter过滤器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Filter过滤器

1、过滤器概念及作用

过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。

它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。

常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

 2、Filter介绍
  • Filter是一个接口。如果想要实现过滤器功能,必须实现该接口!
  • 核心方法
    返回值方法名作用
    voidinit(FilterConfig  config)初始化方法
    void

    doFilter(ServletRequest  request,  ServletResponse  response, 

    FilterChain  chain)

    对请求资源和响应资源过滤
    voiddestroy()销毁方法
  •  

  •  配置方式:

    • 注解方式

    • 配置文件

3、过滤器的编写步骤

编写过滤器

public class FilterDemo1 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       
        HttpServletRequest req = (HttpServletRequest) request;
        String requestURI = req.getRequestURI();
        if (requestURI.contains("favicon.ico")) {
            return;
        }
        System.out.println("FilterDemo1拦截到了请求");
    }

配置过滤器  



    FilterDemo1
    com.itheima.web.filter.FilterDemo1


    FilterDemo1
    /*
 

注意: 我们在配置过滤器的拦截规则时,使用了/*,表明访问当前应用下任何资源,此过滤器都会起作用。除了这种全部过滤的规则之外,它还支持特定类型的过滤配置。(添加具体的过滤拦截页面)

4、FilterConfig介绍

FilterConfig是一个接口,代表过滤器的配置对象,可以加载一些初始化参数。

核心方法:

返回值方法名作用
StringgetFilterName()获取过滤器对象名称
StringgetInitParameter(String key)根据key获取value
EnumerationgetInitParameterNames()获取所有参数的key
ServletContextgetServletContext()获取应用上下文对象

 

代码示例:

配置FilterDemo2


    FilterDemo2
    com.itheima.web.filter.FilterDemo2
    
    
        filterInitParamName
        filterInitParamValue
    


    FilterDemo2
    /ServletDemo1

在FilterDemo2的doFilter方法中添加下面的代码

//根据名称获取过滤器的初始化参数
String paramValue = filterConfig.getInitParameter("filterInitParamName");
System.out.println(paramValue);

//获取过滤器初始化参数名称的枚举
Enumeration initNames = filterConfig.getInitParameterNames();
while(initNames.hasMoreElements()){
    String initName = initNames.nextElement();
    String initValue = filterConfig.getInitParameter(initName);
    System.out.println(initName+","+initValue);
}

//获取ServletContext对象
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(servletContext);

//获取过滤器名称
String filterName = filterConfig.getFilterName();
System.out.println(filterName);

 

 5、FilterChain
  • FilterChain是一个接口,代表过滤器链对象。由Servlet容器提供实现类对象,直接使用即可。
  • 过滤器可以定义多个,就会组成过滤器链。
  • 核心方法:
    返回值方法名作用
    voiddoFilter(ServletRequest request, ServletResponse response)放行方法
     如果有多个过滤器,在第一个过滤器中调用下一个过滤器,依次类推。直到到达最终访问资源。如果只有一个过滤器,放行时,就会直接到达最终访问资源。
  •  
6、过滤器使用细节
  • 配置方式 

    • 注解方式:@WebFilter(拦截路径)

    • 配置文件方式

  • 多个过滤器使用顺序:的配置前后顺序决定过滤器的调用顺序,也就是由映射配置顺序决定。

7、过滤器生命周期 
  • 创建:当应用加载实例化对象并执行init初始化方法。
  • 服务:对象提供服务的过程,执行doFilter方法。
  • 销毁:当应用卸载或服务器停止时,对象销毁,执行destroy方法。 
8、过滤器的五种拦截行为

 我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:


    FilterDemo1
    com.itheima.web.filter.FilterDemo1
    
    true


    FilterDemo1
    /ServletDemo1
    
    REQUEST
    
    ERROR
    
    FORWARD
    
    INCLUDE
    
    ASYNC
9、过滤器与Servlet的区别
方法/类型ServletFilter备注
初始化 方法void init(ServletConfig);void init(FilterConfig);几乎一样,都是在web.xml中配置参数,用该对象的方法可以获取到。
提供服务方法void service(request,response);void dofilter(request,response,FilterChain);Filter比Servlet多了一个FilterChain,它不仅能完成Servlet的功能,而且还可以决定程序是否能继续执行。所以过滤器比Servlet更为强大。 在Struts2中,核心控制器就是一个过滤器。
销毁方法void destroy();void destroy();

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/693880.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号