Filter过滤器

Filter过滤器,第1张

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获取valueEnumerationgetInitParameterNames()获取所有参数的keyServletContextgetServletContext()获取应用上下文对象

 

代码示例:

配置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();

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5694344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存