Filter执行流程
Filter是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,接下来让我们一起来看看Filter的真实面目吧。
一. 概念
过滤器就是在源数据和目的数据之间起过滤作用的中间组件。对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和资源之间的请求与响应信息,并对这些信息进行过滤。
二. 执行流程
当Web容器接受到一个对资源的请求时,它就会判断是否有过滤器与这个资源相关联(这是一个自动的过程)。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端.。
如果有多个过滤器,则它会像一个链(根据web.xml中的位置)一样执行。
我们先看一个图:
三. 实例及解析
我们来看一个登录的例子,它需要用到两个过滤器,一个是转换编码格式,一个是判断是否登录。
先看一下这个例子的时序图:
接下来我们看一下源码:
login.jsp
[java] <pre class="java" name="code"><%@ 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");
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>登录</title>
<SCRIPT language=JavaScript>
function init() {
loginForm.userId.focus();
}
</SCRIPT>
</head>
<body onload=init()>
<FORM name="loginForm">
<input type="hidden" name="command" value="login">
用户名:
<INPUT name="userId" value="dan" type="text" size="20" maxlength="20">
密 码:
<INPUT name="password" value="123" type="password" size="21" maxlength="20">
<input type="submit" onclick="submitForm()" value="提交" name="login" id="login">
</FORM>
</body>
</html>
<pre class="java" name="code"><%@ 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");
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>登录</title>
<SCRIPT language=JavaScript>
function init() {
loginForm.userId.focus();
}
</SCRIPT>
</head>
<body onload=init()>
<FORM name="loginForm">
<input type="hidden" name="command" value="login">
用户名:
<INPUT name="userId" value="dan" type="text" size="20" maxlength="20">
密 码:
<INPUT name="password" value="123" type="password" size="21" maxlength="20">
<input type="submit" onclick="submitForm()" value="提交" name="login" id="login">
</FORM>
</body>
</html>
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) throw
补充:软件开发 , Java ,