Filter执行流程 (一)

2014-11-24 07:11:51 · 作者: · 浏览: 3

Filter是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,接下来让我们一起来看看Filter的真实面目吧。

一. 概念

过滤器就是在源数据和目的数据之间起过滤作用的中间组件。对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和资源之间的请求与响应信息,并对这些信息进行过滤。

二. 执行流程

当Web容器接受到一个对资源的请求时,它就会判断是否有过滤器与这个资源相关联(这是一个自动的过程)。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端.。

如果有多个过滤器,则它会像一个链(根据web.xml中的位置)一样执行。

我们先看一个图:

\


三. 实例及解析

我们来看一个登录的例子,它需要用到两个过滤器,一个是转换编码格式,一个是判断是否登录。

先看一下这个例子的时序图:

\


接下来我们看一下源码:

login.jsp

[java]

<%@ page language="java" contentType="text/html; charset=GB18030" 
pageEncoding="GB18030"%>
<%
String command = request.getParameter("command");
if ("login".equals(command)) {
if ("dan".equals(request.getParameter("userId"))
&& "123".equals(request.getParameter("password"))) {

//登陆成功将用户信息放到session中
session.setAttribute("user_name",
request.getParameter("userId"));

//设置超时,单位:秒
session.setMaxInactiveInterval(6000);

//重定向到主控页面
response.sendRedirect(request.getContextPath() + "/main.jsp");
}
}
%>



登录
<SCRIPT language=java script>
function init() {
loginForm.userId.focus();
}






用户名:

密 码:





<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%
String command = request.getParameter("command");
if ("login".equals(command)) {
if ("dan".equals(request.getParameter("userId"))
&& "123".equals(request.getParameter("password"))) {

//登陆成功将用户信息放到session中
session.setAttribute("user_name",
request.getParameter("userId"));

//设置超时,单位:秒
session.setMaxInactiveInterval(6000);

//重定向到主控页面
response.sendRedirect(request.getContextPath() + "/main.jsp");
}
}
%>



登录
<SCRIPT language=java script>
function init() {
loginForm.userId.focus();
}






用户名:

密 码:





CharsetEncodingFilter.java

[java] package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetEncodingFilter implements Filter {

private String encoding;

@Override
public void destroy() {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
//设置字符集
servletRequest.setCharacterEncoding(encoding);
filterChain.doFilter(servletRequest, servletResponse);

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
//取得初始化参数
this.encoding = filterConfig.getInitParameter("encoding");
}

}
package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetEncodingFilter implements Filter {

private S