[Servlet&JSP] 过滤器的使用

简介: 过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。过滤器的概念像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。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中出现的先后顺序,来决定触发器的执行顺序。

目录
相关文章
|
2月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
72 0
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
37 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
34 1
|
3月前
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
3月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
|
3月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
204 0
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
57 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
29 0