Filter

Filter,第1张

Filter Filter:
  • 过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
  • Filter是一个接口,如果想实现过滤器的功能,必须实现Filter接口
  • Filter可以通过注解和xml配置使用
  • 过滤请求和响应资源,过滤器可以有多个,多个会变成过滤器链

作用:

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

常见应用场景:

URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

核心方法: 返回值方法名说明voidinit(FilterConfig config)初始化方法voiddoFilter(SevletRequest request,ServletResponse response,FilterChain chain)对请求资源和响应资源过滤voiddestroy()销毁方法 FilterChain:

FilterChain是一个接口,代表过滤器链对象,由Servlet容器提供实现。因为过滤了以后还需要放行,所以FilterChain就可以实现放行

返回值方法名说明voiddoFilter(SevletRequest request,ServletResponse response)放行方法

放行的两种过程:

  • 如果有多个过滤器,在第一个过滤器调用下一个过滤器,依次类推直到最终访问资源
  • 如果有一个过滤器放行时,就会直接到达最终访问资源
注解版演示:

需求:通过Filter过滤器解决多个资源写出中文乱码的问题

过滤器:

// @WebFilter:填写拦截的路径,/*代表拦截所有,如果需要配置具体的类写上具体的类名就可以了

@WebFilter("/*")
public class FilterDemo implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter执行");
        // 处理乱码
        servletResponse.setContentType("text/html; charset=UTF-8");
        // 放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

Servlet类:

@WebServlet("/servletDemo")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 浏览器访问就会被拦截器拦下来,然后执行doFilter方法,然后放行
        System.out.println("filterServletDemo执行");
        resp.getWriter().write("filterServletDemo执行");
    }
}
xml版演示:

在xml如果配置多个过滤器那么执行的顺序就是先写哪个,哪个先执行



    
        filterDemo
        com.example.filter.FilterDemo
    
    
        filterDemo
        /*
    

    
        filterDemo2
        com.example.filter.FilterDemo2
    
    
        filterDemo2
        /*
    


生命周期:

Filter的实例对象在内存中也只有一份。所以也是单例的。

  • 出生:当应用加载的时候执行实例化和初始化方法。
  • 活着:只要应用一直提供服务,对象就一直存在。
  • 死亡:当应用卸载时,或者服务器宕机时,对象消亡。
@WebFilter("/*")
public class FilterDemo02 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化成功");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter执行");
        // 处理乱码
        servletResponse.setContentType("text/html; charset=UTF-8");
        // 放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("对象销毁");
    }
}
FilterConfig:

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

核心方法:

返回值方法名说明StringgetFilterName()获取过滤器对象名称StringgetInitParameter(String key)根据key获取valueEnumerationgetInitParameterNames()获取所有参数的keySevletContext getServletContext()获取应用上下文对象

演示:

public class FilterDemo03 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化成功");
        // 获取过滤器名称
        System.out.println(filterConfig.getFilterName());
        // 根据key获取value
        System.out.println(filterConfig.getInitParameter("username"));
        // 获取所有参数的key
        Enumeration keys = filterConfig.getInitParameterNames();
        while (keys.hasMoreElements()){
            // 获取每一个key
            System.out.println(keys.nextElement());
        }
        // 获取应用上下文对象
        System.out.println(filterConfig.getServletContext());
    }
}

xml配置:

    
        filterDemo02
        com.filterDemo.FilterDemo02
        
        
            username
            itzhuzhu
        
    

    
        filterDemo02
        /*
    
过滤器的五种拦截行为:

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

    
        filterDemo2
        com.filterDemo.FilterDemo02
        
        true
        
            username
            itzhuzhu
        
    
    
        filterDemo2
        /*
        
        REQUEST
        
        ERROR
        
        FORWARD
        
        INCLUDE
        
        ASYNC
    
        
    
        java.lang
        error.jsp
    
    
        404
        /main/webapp/WEB-INF/error.jsp
    
过滤器与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://54852.com/zaji/5435126.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存