[Servlet&JSP] 过滤器的使用

过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。

过滤器的概念

像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。Servlet/JSP提供了过滤器机制以实现这些组件服务,可视需求抽换过滤器或调整过滤器的顺序,也可以针对不同的URL应用不同的过滤器,甚至在不同的Servlet间请求转发或包括时应用过滤器。

过滤器的实现

在Servlet/JSP中要实现过滤器,必须实现Filter接口,并在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。Filter接口有三个要实现的方法:

  • init()
  • doFilter()
  • destroy()

如果调用了FilterChain的doFilter()方法,就会执行下一个过滤器,如果没有过滤器,就调用请求目标Servlet的service()方法。如果因为某个情况(如用户没有通过验证)而没有调用FilterChain的doFilter()方法,则请求就不会继续交给接下来的过滤器或目标Servlet,这时就是所谓的拦截请求(从Servlet的观点来看,它根本不知道浏览器发出了请求)。

以下实现一个简单的 性能测量过滤器,以记录请求与响应间的时间差,并了解Servlet处理请求到响应所需花费的时间。

PerformanceFilter.java:

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 PerformanceFilter implements Filter{
    private FilterConfig filterConfig;

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long begin = System.currentTimeMillis();
        chain.doFilter(request, response);
        filterConfig.getServletContext().log("Request process in " +
            (System.currentTimeMillis() - begin) + " milliseconds");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
}

web.xml中的设置:

<web-app ...>
    <filter>
        <filter-name>PerformanceFilter</filter-name>
        <filter-class>club.chuxing.PerformanceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PerformanceFilter</filter-name>
        <url-pattern>/prime.do</url-pattern>
        <!-- <servlet-name>PrimeServlet</servlet-name> -->
    </filter-mapping>

    <servlet>
        <servlet-name>PrimeServlet</servlet-name>
        <servlet-class>club.chuxing.PrimeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PrimeServlet</servlet-name>
        <url-pattern>/prime.do</url-pattern>
    </servlet-mapping>
</web-app>

在web.xml中 ,</filter-mapping>可以使用<url-pattern>或者<servlet-name>来表示哪些URL或Servlet将应用此过滤器。如果想一次符合所有的Servlet名称,则可以使用星号(*)。

如果在过滤器初始化时想要读取一些参数,则可以在<filter>标签中进行设置,如:

<filter>
    <filter-name>PerformanceFilter</filter-name>
    <filter-class>club.chuxing.PerformanceFilter</filter-class>
    <init-param>
        <param-name>param1</param-name>
        <param-value>value1</param-value>
    </init-param>
</filter>

接着在init()方法中可以使用如下语句获得初始参数值:

public void init(FilterConfig filterConfig) throws ServletException {
        String param1 = filterConfig.getInitParameter("param1");
        //other process
    }

触发过滤器的时机,默认是浏览器直接发出请求。如果是那些通过RequestDispatcherforward()include()而来的请求,则可以在web.xml中设置<dispatcher>标签,指定那些请求转发类型可以通过过滤器。如果不设置<dispatcher>标签,则默认为REQUESTERROR是指由容器处理异常而转发过来的请求可以触发过滤器。

<filter-mapping>
    <filter-name>PerformanceFilter</filter-name>
    <servlet-name>*.do</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

如果有某个URL或者Servlet会应用多个过滤器,则根据<filter-mapping>在web.xml中出现的先后顺序,来决定触发器的执行顺序。

时间: 2024-08-18 02:48:27

[Servlet&amp;JSP] 过滤器的使用的相关文章

servlet和JSP过滤器Filter

js|servlet 或许,servlet API的2.3版本中最重要的一个新功能就是能够为servlet和JSP页面定义过滤器.过滤器提供了某些早期服务器所支持的非标准"servlet链接"的一种功能强大且标准的替代品.过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息.在这之后,过滤器可以作如下的选择:l 以常规的方式调用资源(即,调用servlet或JSP页面).l

Servlet和JSP迈上新台阶

js|servlet 即将面世的J2EE 1.4提供用Java开发Web应用程序的新的Servlet 2.4和JavaServer Pages (JSP) 2.0技术.本文展示了这两种技术的新特性,并在适当的地方提供每个特性的示例代码.本文假设读者熟悉以前的 Servlet 2.3和JSP 1.2版本.给出的例子已用Tomcat 5(包含在Java Web Services Developer Pack 1.2中)进行了测试. Servlet和JSP毫无疑问是两种应用最广的J2EE技术.Serv

Servlet和JSP知识复习(1)Servlet &amp;amp; JSP 技术概述

js|servlet Servlet和JSP知识复习(1)Servlet & JSP 技术概述 1.Servlet的功用    ·读取客户程序发送来的显式数据(表单数据)    ·读取客户程序发送来的隐式数据(请求报头)    ·生成相应的结果    ·发送显式的数据给客户程序(HTML)    ·发送隐式的数据给客户程序(状态代码和响应报头) 2.为什么要动态地构建Web页面?    ·Web页面的内容建立在用户提交的数据之上    ·Web页面的内容由频繁变动的数据导出    ·Web页面用

调优servlet和JSP的程序性能

本文讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强.而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势.在本文中,我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升.其中,某些调优技术是在你的编程工作中实现的.而另一些技术是与应用服务器的配置相关的.在本文中,我们将详细地描述怎样通过调整servlet和JSP页面,来提高你的应用程序的总体性能.在阅读本文之前,假设你有基本的servlet和JSP的知识. 方法

用servlet将jsp文件内容转为html

用servlet将jsp文件内容转为html. 用servlet将jsp文件内容转为html.代码如下: package examples; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.serv

Servlet、Jsp性能优化

js|servlet|性能|优化 你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升J2EE的性能.这些技术的部分用于开发阶段,例如,设计和编码阶段.另一部分技术则与配置相关. 技术1:在HttpServlet init()方法中缓存数据

一、Servlet和JSP概述

js|servlet  1.1 Java Servlet及其特点 Servlet是Java技术对CGI编程的回答.Servlet程序在服务器端运行,动态地生成Web页面.与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-):     高效      在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要

Java Servlet 和 JSP教程(2)

js|servlet|教程 2 安装 2.1 安装Servlet和JSP开发工具 要学习Servlet和JSP开发,首先你必须准备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境.Sun提供免费的JavaServer Web Development Kit(JSWDK),可以从http://java.sun.com/products/servlet/下载. 安装好JSWDK之后,你还要告诉javac,在编译文件的时候到哪里去寻找Ser

Java Servlet 和 JSP教程(3)

js|servlet|教程 3 Servlet 3.1 Servlet基本结构 下面的代码显示了一个简单Servlet的基本结构.该Servlet处理的是GET请求,所谓的GET请求,如果你不熟悉HTTP,可以把它看成是当用户在浏览器地址栏输入URL.点击Web页面中的链接.提交没有指定METHOD的表单时浏览器所发出的请求.Servlet也可以很方便地处理POST请求.POST请求是提交那些指定了METHOD="POST"的表单时所发出的请求,具体请参见稍后几节的讨论. import