假设你们要进入一个城堡,这个城堡的规则是在第一关的时候你必须穿着正装,OK,门卫就会先看一下你是否穿着符合规则的正装;那个第一关的门卫就是过滤器,那如果是只有一个人申请进入城堡的话,门卫当然会只检查你一个人了。
<filter-name>filter</filter-name>
<filter-class>dc.gz.filters.MyCharsetFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!-- * 代表截获所有的请求 或指定请求/test.do /xxx.do -->
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就会把所有的请求的编码都设置为UTF-8;下面的相同。
问题来了:1、门卫(过滤器)是什么意思?
2、我要进入城堡没错,但是我怎么确定你就是这个城堡的门卫呢?
3、我知道你是这个城堡的门卫,那你怎么工作的呢?
4、你的穿正装的规定是怎么定义的?
5、如果我穿的不符合规定,你怎么做啊?
6、我穿的是正装,那我能直接进入城堡吗?
先来回答第一个问题:
1、门卫(过滤器)是什么意思?
好的,大人,我先来回答第一个问题,门卫也是人,你可能会笑,OK,换句话,过滤器就是一个servlet。
Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或是其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet的简单教程链接:
http://www.runoob.com/servlet/servlet-intro.html ,我就不再搬砖了。
OK,我们知道门卫(过滤器)是什么了之后,就得回答第二个问题了。
2、眼前的这个门卫是这个城堡的门卫吗?我怎么让他成为我城堡的门外呢?
回答:在web项目中的web.xml文件中配置代码如下:
<filter> <filter-name>filter</filter-name>
<filter-class>dc.gz.filters.MyCharsetFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!-- * 代表截获所有的请求 或指定请求/test.do /xxx.do -->
<url-pattern>/*</url-pattern>
</filter-mapping>
有了这行代码,算是注册了,这就将urlFilter(url过滤器)放到这个城堡的外面了,成为一个门卫(过滤器)了。我这个城堡的主人只需要一次告诉他说:你是门卫了,你可以工作就可以。用专业的话讲就是:
它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
3、我知道你是这个城堡的门卫,那你怎么工作的呢?
答:当你知道你眼前的这个是门卫了,他的工作方式是:你发出一个请求,要进入城堡,门卫一看你穿的衣服,根据城堡主人的规定,得出你是否符合要求,如果符合且没有其他要求了,那你就能进入下一关,如果不符合,就需要告诉你,你不符合什么规则,没有办法进入城堡。
用计算机语言就是:当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。
好了,过了第一关,我们很高兴的以为能进入城堡,但是事多的城堡主人还有规定,女性必须是漂亮女人,而且打扮还必须很性感,得,这个时候怎么办?我们进入第二关,第三关,也就是一个检查链,在Java过滤器中有过滤链FilterChain.
FilterChain又是怎么回事?看下图:
服务器按照web.xml中定义的过滤器的先后顺序来进入第一个过滤器的chain.doFilter(),然后进入第二个过滤器的chain.doFilter()方法,如果其中有不符合规则的,就给出响应。
4、你的穿正装的规定是怎么定义的?
也就是说,在web服务中过滤器中的规则是如何定义的?
看下面的代码:
MyCharsetFilter.java 编码过滤器
package ...;
import ...;
// 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.
// Filter跟web应用一起启动
// 当web应用重新启动或销毁时,Filter也被销毁
public class MyCharsetFilter implements Filter {
private FilterConfig config = null ;
public void destroy() {
System. out .println( "MyCharsetFilter准备销毁..." );
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
// 强制类型转换
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
// 获取web.xm设置的编码集,设置到Request、Response中
package ...;
import ...;
// 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.
// Filter跟web应用一起启动
// 当web应用重新启动或销毁时,Filter也被销毁
public class MyCharsetFilter implements Filter {
private FilterConfig config = null ;
public void destroy() {
System. out .println( "MyCharsetFilter准备销毁..." );
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
// 强制类型转换
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
// 获取web.xm设置的编码集,设置到Request、Response中
request.setCharacterEncoding(config.getInitParameter("charset"));
response.setContentType(config.getInitParameter("contentType"));
// 将请求转发到目的地
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
this .config = arg0;
System. out .println( "MyCharsetFilter初始化..." );
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
this .config = arg0;
System. out .println( "MyCharsetFilter初始化..." );
}
}
OK,看这行代码:
request.setCharacterEncoding(config.getInitParameter("charset"));
这行代码里的config.getInitParameter("charset")
拿的就是在web.xml文件中配置的<param-name>charset</param-name>
<param-value>UTF-8</param-value>
它的值,也就是UTF-8;
5、如果我穿的不符合规定,你怎么做啊?
那就不行了,或者是空白页面,或者是404,如果浏览器自身有404页面,说不定你会得到浏览器自身的404页面哦。
6、我穿的是正装,那我能直接进入城堡吗?
对的,符合规定了,也找到相应的方法了,那就可以进入服务器的返回信息。