当前位置:编程学习 > JAVA >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,