JSP中的过滤器Filter_陆丰凯_新浪博客

   过滤器位于中间层起过滤作用,用于拦截请求或响应信息,为Java Web程序提供一个预处理的机会,增强Java Web应用程序的灵活性。过滤器是Servlet2.3新添加的功能。过滤器并不是Sertlet。而是位于请求与响应中间的实现过滤功能的程序,在服务器上它先于与之相关的Servlet或JSP页面运行。通常用它来实现一些特殊的功能,比如资源请求及响应报告,日志记录,访问权限控制,编码转换,数据加密等。

 

  Servlet能够对Servlet容器的请求和响应对象进行检查和修改。Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。

Servlet过滤器具有以下特点:

  • Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发过滤器工作
  • Servlet过滤器是Java Servlet规范2.3的一部分,因此所有实现Java Servlet规范2.3的Servlet容器都支持Servlet过滤器
  • 贸易独立的Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象

1、创建Servlet过滤器

    所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:

  • init(FileterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servelt过滤器的初始化参数
  • doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
  • destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源

例如1:

 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 java.util.*;

public class PageTimersFilter implements Filter {

 FilterConfig filterConfig = null;
 
 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  Date startTime,endTime;
  double duration = 0;
  startTime = new Date();//记下开始时间
  chain.doFilter(request,response);//将处理权转交给下一处理器
  endTime = new Date();//记下结束时间
  duration = endTime.getTime()-startTime.getTime();//计算所耗费时间
  System.out.println("本次请求/响应耗时:"+duration+"hm!");
 }

 public void destroy() {
  this.filterConfig = null;
 }

}

相关配置说明:

<filter>
  <filter-name>pageTimers</filter-name>
  <filter-class>PageTimersFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>pageTimers</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

例子2:Filter实现编码过滤器

  1.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 EncodingFilter implements Filter {

 String encoding = null;
 FilterConfig filterConfig = null;
 
 //初始化方法
 public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
 }

 //过滤处理方法
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  // TODO Auto-generated method stub
  if (encoding!=null){
   //对请求进行编码设置
   request.setCharacterEncoding(encoding);
  }
  //将处理权转交给下一个处理器
  chain.doFilter(request,response);
 }

 //销毁方法
 public void destroy() {
  // TODO Auto-generated method stub
  this.encoding = null;
  this.filterConfig = null;
 }

}

2.相关配置:

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>EncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>gb2312</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 

3.index.html

<html>
  <head>
    <title>编码过滤器测试</title>
    <meta http-equiv="content-type" content="text/html; charset=gb2312">
  </head>
 
  <body>
    <form name="form1" action="process.jsp" method="POST">
     请输入姓名:<input name="name" type="text">
     <input name="submit" value="提交" type="submit">
    </form>
  </body>
</html>

 

4.process.jsp

   <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
  <head>
    <title>编码过滤器测试</title>
  </head>
 
  <body>
    <%=request.getParameter("name")%>,你好!<br>
  </body>
</html>

已投稿到:
郑重声明:资讯 【JSP中的过滤器Filter_陆丰凯_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——