JAVAWEB Filter使用

Filter学习
 1Filter是什么:是过滤器简称
 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行            包装,再把包装对象传给目标资源,从而实现一些特殊需求。
  Example: 举一个不恰当的例子:比如当我们喜欢的人电话给我们,我们想手机提供不一样的铃声,
        让我来区分是谁打电话给我,这样我就不用拿出手机出来,才知道谁打电话给我
 3Filter运行原理解析
 如下图:
 

   3Filter接口的介绍:
 ①FilterConfig接口:用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始            化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

   ②FilterChian接口:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
          web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表            Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain          对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源(就是URL的资源)。

 3Filter怎样使用:
  使用步骤:

    1自定义Filter,并实现内置的Filter接口
    2复写doFilter()方法,在里面处理我们需要的逻辑
    3若还有其他过滤器就调用FilterChian的doFilter()方法
    4若返回页面就是用response
    5注册Filter,配置Filter拦截怎样的请求
 4JAVAWEB的Filter代码示例
①自定义Filter:

package com.filter.demo;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter{
    
    FilterConfig filterConfig=null;
    String characterEncoding="UTF-8";
    String str;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        System.out.println("拦截到请求了");
        System.out.println("编码为---->"+str);
        if (str==null) {
            System.out.println();
            str=characterEncoding;
        }
        //2设置编码
        request.setCharacterEncoding(str);
        response.setCharacterEncoding(str);
        request.setAttribute("name", "jere");
        System.out.println("执行前--->name="+request.getAttribute("name"));
        //返回下一个Filter
        arg2.doFilter(request, response);
        System.out.println("执行后--->name="+request.getAttribute("name"));
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println(this.getClass().getName()+"过滤器启动了-----");
        //获取启动的时的参数
        filterConfig=arg0;
        str=filterConfig.getInitParameter("name");
    }

}

自定义Servlet:

package com.filter.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jasper.tagplugins.jstl.core.Out;

/**
 * Servlet implementation class FilterServlet
 */
public class FilterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FilterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("test");
        request.setAttribute("name", "jeremy");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

③在web.xml文件注册Servlet和Filter
  

 <servlet>
    <description></description>
    <display-name>FilterServlet</display-name>
    <servlet-name>FilterServlet</servlet-name>
    <servlet-class>com.filter.demo.FilterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FilterServlet</servlet-name>
    <url-pattern>/FilterServlet</url-pattern>
  </servlet-mapping>
  <filter>
          <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.filter.demo.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
  </filter>
  <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>
      <!-- 也可以使用URL-Pattern --> <servlet-name>FilterServlet</servlet-name> </filter-mapping>

页面测试

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="/FilterDemo/FilterServlet">test Filter</a>
</body>
</html>

以上就是简单的FIlter示例

posted @ 2015-04-12 15:19  Jeremy_software  阅读(407)  评论(0编辑  收藏  举报