Javaweb三大组件之Filter

1.Filter的广义概念

Javaweb开发中第二个很重要的组件是Filter,它和Serlver非常相似,所以学习完Servlet之后学习Filter就会很快。Filter在Javaweb开发中担当的角色是一个过滤器,顾名思义就是对客户端的请求进行过滤,然后才发送给Servlet进行处理,差不多就是下图的所示样子。

Javaweb三大组件之Filter_第1张图片

2.Filter的作用

过滤器实际上主要担当一些切面的工作,比如登录状态判断,编码格式转化,如果不在过滤器这里写的话,那就要在每个Servlet中写一遍很烦对吧,而且维护起来也很麻烦。过滤器将客户端的请求进行初步的切面处理和包装,并且进行适当的过滤,某些非法的请求肯定是不会让通过Filter访问我们的Servlet的,Filter可以有多个,只有经过这层层的过滤器处理,请求才能到达Servlet去处理客户真正的业务,这就是Filter在Javaweb担当的基本职责。

3.Filter的狭义概念

Javaweb三大组件之Filter_第2张图片

它和Servlet相同都是一个接口,而且看起来更简单,只有三个方法。init和destroy方法和Servlet中的是一样的,doFilter方法类似于Servlet中的service方法,是执行具体操作的函数。接下来看看Filter怎么使用。

 

4.Fliter的基本用法

同Servlet一样,首先要去实现Filter接口。

public class FilterDemo1 implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(filterConfig.getInitParameter("filtername"));
        System.out.println("FiltetDemo1 has been created");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("FilterDemo1 has effective");
        //继续调用下一个过滤器链上的过滤器或者是已经是最后一个过滤器则调用Servlet
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("FilterDemo1 return");
    }

    @Override
    public void destroy() {
        System.out.println("FilterDemo1 has been destroyed");
    }
}

这里不同于Servlet是有一个FilterChain参数,剩下的ServletRequest和ServletResponse和Servlet中的用法是相同的。FilterChain参数是调用过滤器链的下一个过滤器,因为过滤器不止一个,执行为这个过滤器执行下一个就是通过这个参数调用doFilter函数向下传递,直到到达Servlet然后在倒着返回给客户端,执行回复部分的代码。

接下来是配置xml,没有xml的配置,过滤器和Servlet一样是不会生效的。


    
    
        filterDemo1
        com.lyh.Filter.FilterDemo1
        
        
            filtername
            filterDemo
        
    
    
    
        filterDemo1
        
        /*
        
        

        
        REQUEST
        
        FORWARD
        
        INCLUDE
        
        ERROR
    

同样Filter也可以配置多个,配置多个时候,如果一个url可以同时匹配到多个过滤器,那么执行的顺序就是按照过滤器在xml是声明的顺序来依次过滤,最后是Servlet。

Filter的生命周期和Servlet有所不同,所有的Filter对象都是随着服务器启动同时创建的,然后随着服务器关闭而销毁。

5. HttpFilter的基本用法

最后我们看到Servlet有实现好的HttpServlet类,那么Filter呢,同样也是有HttpFilter的。

Javaweb三大组件之Filter_第3张图片

HttpFilter是实现了GenericFilter类,GenericFilter类中增加FilterConfig域,并且写好了getServletContext函数可以获取到全局对象ServletContext,这是一个用处,其次HttpServlet类帮我们封装好了一个新的doFilter方法,参数都是Http格式的,所以用起来更加方便,下面是一个HttpFilter实例。

public class HttpFilterDemo1 extends HttpFilter{
    public HttpFilterDemo1() {
        System.out.println("HttpFilterDemo1 has been created");
    }

    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        ServletContext sc = getServletContext();
        System.out.println("ServletContextParam: "+sc.getInitParameter("ServletContextParam"));
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("HttpFilterDemo1 has been destroyed");
    }
}

需要在web.xml中添加配置(需要在Filter声明的配置之前添加):

 
        ServletContextParam
        hello
    

以上就是Javaweb第二大组件Filter的基本用法,接下来要做的到实际项目中使用,处理登录,session,cookie。编码等等问题。

你可能感兴趣的:(Java,EE)