首页 > 代码库 > servlet之filter
servlet之filter
过滤器:如图所示,可以对请求和响应资源进行拦截过滤,一般用于改变请求(request)和响应(response)的头信息与内容信息,改变信息的编码方式等等。可以指定按照一定顺 序调用的一个和多个过滤器,这就组成了链(chain)。
实现过滤器非常简单,只需要实现javax.servlet.Filter接口,就可以实现一个过滤器,Web容器负责创建javax.servler.FilterConfig对象,在容器启动时实例化和初始化过滤器在调用init()方法后开始(init是容器自动调用的)。Filter接口定义的方法如下:
- void init(FilterConfig filterConfig))--在filter被加载到service中的时候被container调用,Servlet container实例化完filter以后立即调用Filter的init方法并自动传递一个FilterConfig对象进去,init方法中的工作必须在执行过滤过滤任务之前正确的完成。
- void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)--Filter中的doFilter方法在每次request/response时候会被container调用,能够传递到doFilter中的request或者response可以传递到Filter环中的下一个环节。 此时的Filter在设计模式中被称作责任链模式结构,这里面抽象处理者的角色就是javax.servlet.Filter这个接口,注册的所有Filter是具体的处理者,在doFilter方法中实现具体处理逻辑,在这里面责任链是一条直线,构成这条直线的就是所有注册的Filter。
- destroy--当filter从service中移除的时候,container调用destroy方法,通过调用这个方法,释放Filter所占有的系统资源。
现在看看web.xml的配置片段:
<filter> <display-name>EcodingFilter</display-name> <filter-name>EcodingFilter</filter-name> <filter-class>org.filter.ConfigFilter</filter-class> <init-param> <param-name>EncodeCoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>ConfigFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping
java片段代码:
public class ConfigFilter implements Filter{ private String parm=null; private FilterConfig filterconfig= null;//web容器负责创建 public ConfigFilter(){ super(); } public void destroy() { System.out.println("Filter destroy....."); } public void doFilter(ServletRequest res, ServletResponse rep, FilterChain chain) throws IOException, ServletException { _encoding=this.filterconfig.getInitParameter("filterParam"); res.setHeader("Pragma","No-cache"); res.setHeader("Cache-Control","no-cache"); String _encoding = this.encoding; if (_encoding != null) { /** * 采用设置的字符集 */ request.setCharacterEncoding(_encoding); } else { /** * 若未设置字符集,默认为utf-8 */ request.setCharacterEncoding("utf-8"); } chain.doFilter(res, rep); System.out.println("Filter in work"); } public void init(FilterConfig filter) throws ServletException { this.filterconfig=filter;//web容器初始化过滤器时自动调用 System.out.println("Initialing the Filter..."); } }
以上代码就是过滤器的一般流程,通过读取init-param参数获得编码方式,然后在每次请求时加以设置。doFilter方法作用是表示该过滤器已经完成了工作,现在将资源交给下一个过滤器,这也从而组成了所谓的过滤器链!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。