与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中,但是与其他web应用程序组件不同的是,过滤器是链在容器的处理过程中的,这就意味着他们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息,这种访问使过滤器可以检查并修改请求和响应的内容
两个过滤器,EncodingFilter负责设置编码,SecurityFilter负责控制权限,服务器会按照web.xml中过滤器定义的先后顺序组成一条链,然后一次执行其中的doFilter()方法,
顺序: 执行第一个过滤器的chain.doFilter()之前的代码->第二个过滤器的chain.doFilter()之前的代码,请求的资源->第二个过滤器的chain.doFilter()之后的代码->第一个过滤器的chain.doFilter()之后的代码,最后返回响应
在调用servlet的service()方法之前,容器会先创建一个filterchain,并把servlet传入这个filterchain对象,作为其内部参数。
创建这个filterchain的时候,会根据请求的uri,把符合条件的filter加入到这个chain里。紧接着就调用这个filterchain的doFilter方法。
这个filterchain的doFilter方法就会按顺序(在web.xml定义的顺序)调用各个filter的doFilter方法。当所有的filter的doFilter方法都调用完以后,才会调用servlet的service方法。
service方法调用结束后会返回上一次的chain.doFilter方法,并执行doFilter方法后面的代码。接着,返回上上一个chain.doFilter方法
因此,我们的Filter都是在chain.doFilter方法调用之前来处理request请求,在chain.doFilter方法调用之后处理response响应。
过滤链的好处是执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容.
实际使用时,要注意执行顺序问题,EncodingFilter一定要放在所有Filter之前,才能确保在使用请求中的数据前设置正确的密码