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方法作用是表示该过滤器已经完成了工作,现在将资源交给下一个过滤器,这也从而组成了所谓的过滤器链!

时间: 2024-10-20 11:02:27

servlet之filter的相关文章

Servlet和Filter的url匹配以及url-pattern详解

Servlet和Filter的url匹配以及url-pattern详解 Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间. 一,servlet容器对url的匹配过 当一个请求发送到servlet容器的时候,容器先会将请

java web.xml listener servlet 和filter的加载顺序

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. 最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servle

开启 J2EE(六)— Servlet之Filter详解及乱码处理实例

定义和功能 Filter:过滤器,它能够在request到达Servlet之前预处理request,也可以在离开Servlet时处理response,通过对request或response的处理已达到过滤功能.但是Filter只是对request和response请求进行了拦截处理,通常不产生请求或者响应. 实现的接口 我们写Servlet需要继承一个类,Filter也一样,要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法: <span styl

servlet、filter、listener继承的基类和获得作用域的方式

一.servlet: 1.servlet属于j2ee的组件,构建servlet的web project不需要导入项目框架jar包 2.servlet的体系结构:  在j2ee API中,提供给servlet的支持接口和基类都位于javax.servlet.*和javax.servlet.http.*(提供所有与http请求有关的API)两个包中  servlet包中常使用的接口   Interface ServletConfig   Interface ServletContext   Inte

servlet的filter的使用

一.概述 过滤器是servlet的一个重要特性,它提供一种机制,允许在过滤器中,即可以修改浏览器的请求信息,也可以对服务器处理后的响应信息进行修改. 一个过滤器是一个实现了Filter接口的java类.其关键的的方法是: void doFilter(ServletRequest req, ServletResponse resp,  FilterChain chain) 在该方法中可以做如下动作: 1)通过参数req可以获取请求信息,并可以修改请求信息.当然也可以不做任何事情. 2)调用参数ch

实战-JavaWweb的Servlet和Filter运行关系(三)

本文继续实践"实战-JavaWweb的Servlet和Filter运行关系(一) "一文中留下的问题. 问题二: 在Filter没有执行chain.doFilter(request,response)方法的时候,response对象输出的内容有那些部分组成的. 在(文一)的基础上对RequestFilter做了略微改动,改动部分如下: 图c-1 说明:请求TestServlet,如何没有参数"p"则不执行china.doFilter方法,如果存在则执行. 下面对这两

实战-JavaWweb的Servlet和Filter运行关系(四)

通过三篇实践性文章的说明和总结,理解Servlet和Filter之间的运行关系. 实战-JavaWweb的Servlet和Filter运行关系(一) 实战-JavaWweb的Servlet和Filter运行关系(二) 实战-JavaWweb的Servlet和Filter运行关系(三) 下面是一张Servlet和Filter的运行关系图,用来说明Servlet和Filter的执行顺序,Response对象输出内容组成等问题. 图d-1 1.Filter链执行顺序 Filter1->Filter2-

深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些"服务器端运行的小程序"对服务器实现的无关性(即提升了其可移植性).在Servlet规范有以下几个核心类(接口):ServletContext:定义了一些可以和Servlet Container交互的

web.xml中关于Servlet、Filter、Listener的配置

(一)web.xml不同元素的加载顺序 加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的 (二)web.xml文件详解 (2.1) 首先是sche

浅谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用

在javaweb开发中,Servlet和Filter是很重要的两个概念,我们平时进行javaweb开发的时候,会经常和Servlet和Filter打交道,但我们真的了解Servlet和Filter吗? 一.基本概念 Servlet: Servlet 是在WEB服务器上运行的程序.这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务. 服务器上需要一些程序,