Servlet过滤器

SERVLET过滤器 全球因特网用户使用不同类型的Web浏览器访问应用服务器上存储的Web应用程序。每个浏览器根据对应的Web浏览器窗口中的设置显示应用程序中的信息。Web应用程序可能会有一些客户机的Web浏览器不支持的HTML标记或功能。这种情况下,应用程序在客户机的Web浏览器中可能运行,可能不运行,还可能生成不需要的输出。为了避免这种问题,在调用servlet之前需要识别浏览器的类型和向Web应用程序发送请求的客户机和其他特定的信息。 阅读详情
1.Servlet过滤器
 
1.1什么是过滤器
过滤器是一个程序,它先于与之相关的 servlet 或 JSP 页面运行在服务器上。过滤器可附加到一个或多个 servlet 或 JSP 页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源(即,调用 servlet 或 JSP 页面)。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
1.2 Servlet 过滤器的基本原理
在 Servlet 作 为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例 如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数 据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视 图派发到指定的错误页面。
2 . Servlet 过滤器开发步骤
开发 Servlet 过滤器的步骤如下:
①编写实现 Filter 接口的 Servlet 类。
②在 web.xml 中配置 Filter 。
开发一个过滤器需要实现 Filter 接口, Filter 接口定义了以下方法:
① destory ()由 Web 容器调用,初始化此 Filter 。
② init ( FilterConfig filterConfig )由 Web 容器调用,初始化此 Filter 。
③ doFilter ( ServletRequest request,ServletResponse response,FilterChain chain )具体过滤处理代码。
3 .一个过滤器框架实例
SimpleFilter1.java
package com.zj.sample;
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 SimpleFilter1 implements Filter {
        @SuppressWarnings("unused" )
        private FilterConfig filterConfig;
    
        public void init(FilterConfig config) throws ServletException {
             this .filterConfig = config;
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) {
             try {
                     System.out.println("Within SimpleFilter1:Filtering the Request..." );
                     chain.doFilter(request, response);// 把处理发送到下一个过滤器
                     System.out .println("Within SimpleFilter1:Filtering the Response..." );
             } catch (IOException ioe) {
                     ioe.printStackTrace();
             } catch (ServletException se) {
                     se.printStackTrace();
             }
        }
    
        public void destroy() {
             this .filterConfig = null ;
        }
}
 
SimpleFilter2.java
package com.zj.sample;
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 SimpleFilter2 implements Filter {
        @SuppressWarnings("unused" )
        private FilterConfig filterConfig;
    
        public void init(FilterConfig config) throws ServletException {
             this .filterConfig = config;
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) {
             try {
                     System.out.println("Within SimpleFilter2:Filtering the Request..." );
                     chain.doFilter(request, response); // 把处理发送到下一个过滤器
                     System.out.println("Within SimpleFilter2:Filtering the Response..." );
             } catch (IOException ioe) {
                     ioe.printStackTrace();
             } catch (ServletException se) {
                     se.printStackTrace();
             }
        }
    
        public void destroy() {
             this .filterConfig = null ;
        }
}
 
web.xml
< filter >
         < filter-name > filter1 </ filter-name >
         < filter-class > com.zj.sample.SimpleFilter1 </ filter-class >
</ filter >
< filter-mapping >
         < filter-name > filter1 </ filter-name >
         < url-pattern > /* </ url-pattern > //为所有的访问做过滤
</ filter-mapping >
    
< filter >
         < filter-name > filter2 </ filter-name >
         < filter-class > com.zj.sample.SimpleFilter2 </ filter-class >
</ filter >
< filter-mapping >
         < filter-name > filter2 </ filter-name >
         < url-pattern > /* </ url-pattern > //为所有的访问做过滤
</ filter-mapping >
输出结果:
(注意过滤器执行的请求 / 响应顺序) Within SimpleFilter1:Filtering the Request...
Within SimpleFilter2:Filtering the Request...
Within SimpleFilter2:Filtering the Response...
Within SimpleFilter1:Filtering the Response...
4 .报告过滤器
我们来试验一个简单的过滤器,只要调用相关的 servlet 或 JSP 页面,它就打印一条消息到标准输出。为实现此功能,在 doFilter 方法中执行过滤行为。每当调用与这个过滤器相关的 servlet 或 JSP 页面时, doFilter 方法就生成一个打印输出,此输出列出请求主机和调用的 URL 。因为 getRequestURL 方法位于 HttpServletRequest 而不是 ServletRequest 中,所以把 ServletRequest 对象构造为 HttpServletRequest 类型。我们改动一下章节 3 的 SimpleFilter1.java
SimpleFilter1.java
package com.zj.sample;
import java.io.IOException;
import java.util.Date;
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;
    
public class SimpleFilter1 implements Filter {
        @SuppressWarnings( "unused" )
         private FilterConfig filterConfig;
    
         public void init(FilterConfig config) throws ServletException {
             this .filterConfig = config;
        }
    
         public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) {
             try {
                     System.out.println( "Within SimpleFilter1:Filtering the Request..." );
                     HttpServletRequest req = (HttpServletRequest) request;
                     System.out.println(req.getRemoteHost() + " tried to access "
                                    + req.getRequestURL() + " on " + new Date() + "." );
                     chain.doFilter(request, response);
                     System.out.println( "Within SimpleFilter1:Filtering the Response..." );
             } catch (IOException ioe) {
                     ioe.printStackTrace();
             } catch (ServletException se) {
                     se.printStackTrace();
             }
        }
    
         public void destroy() {
             this .filterConfig = null ;
        }
}
 
web.xml 设置不变
 
结果:Within SimpleFilter1:Filtering the Request...
0:0:0:0:0:0:0:1 tried to access [url]http://localhost:8080/Test4Jsp/login.jsp[/url] on Sun Mar 04 17:01:37 CST 2007.
Within SimpleFilter2:Filtering the Request...
Within SimpleFilter2:Filtering the Response...
Within SimpleFilter1:Filtering the Response...
5 .访问时的过滤器 (在过滤器中使用 servlet 初始化参数)
下面利用 init 设定一个正常访问时间范围,对那些不在此时间段的访问作出记录。我们改动一下章节3 的 SimpleFilter2 .java 。
 
SimpleFilter2 .java
package com.zj.sample;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
    
public class SimpleFilter2 implements Filter {
        @SuppressWarnings( "unused" )
         private FilterConfig config;
         private ServletContext context;
         private int startTime, endTime;
         private DateFormat formatter;
    
         public void init(FilterConfig config) throws ServletException {
             this .config = config;
             context = config.getServletContext();
             formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
                            DateFormat.MEDIUM);
             try {
                     startTime = Integer.parseInt(config.getInitParameter( "startTime" )); // web.xml
                     endTime = Integer.parseInt(config.getInitParameter( "endTime" )); // web.xml
             } catch (NumberFormatException nfe) { // Malformed or null
                     // Default: access at or after 10 p.m. but before 6 a.m. is
                     // considered unusual.
                     startTime = 22; // 10:00 p.m.
                     endTime = 6; // 6:00 a.m.
             }
        }
    
         public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) {
             try {
                     System.out.println( "Within SimpleFilter2:Filtering the Request..." );
                     HttpServletRequest req = (HttpServletRequest) request;
                     GregorianCalendar calendar = new GregorianCalendar();
                     int currentTime = calendar.get(Calendar.HOUR_OF_DAY);
                     if (isUnusualTime(currentTime, startTime, endTime)) {
                            context.log( "WARNING: " + req.getRemoteHost() + " accessed "
                                         + req.getRequestURL() + " on "
                                         + formatter.format(calendar.getTime()));
                             // The log file is under <CATALINA_HOME>/logs.One log per day.
                     }
                     chain.doFilter(request, response);
                     System.out
                                    .println( "Within SimpleFilter2:Filtering the Response..." );
             } catch (IOException ioe) {
                     ioe.printStackTrace();
             } catch (ServletException se) {
                     se.printStackTrace();
             }
        }
    
         public void destroy() {}
    
         // Is the current time between the start and end
         // times that are marked as abnormal access times?
         private boolean isUnusualTime( int currentTime, int startTime, int endTime) {
             // If the start time is less than the end time (i.e.,
             // they are two times on the same day), then the
             // current time is considered unusual if it is
             // between the start and end times.
             if (startTime < endTime) {
                     return ((currentTime >= startTime) && (currentTime < endTime));
             }
             // If the start time is greater than or equal to the
             // end time (i.e., the start time is on one day and
             // the end time is on the next day), then the current
             // time is considered unusual if it is NOT between
             // the end and start times.
             else {
                     return (!isUnusualTime(currentTime, endTime, startTime));
             }
        }
}
 
web.xml设置不变
关于 Tomcat 日志处理,这里补充介绍一下。 config.getServletContext().log ( "log message" )会将日志信息写入 <CATALINA_HOME>/logs 文件夹下,文件名应该为 localhost_log.2007-03-04.txt 这样的形式(按日期每天产生一个,第二天可以看见)。要得到这样一个日志文件,应该在 server.xml 中有:
< Logger className ="org.apache.catalina.logger.FileLogger" prefix ="catalina_log." suffix =".txt" timestamp ="true" />
 
本文出自 “ 子 孑 ” 博客,请务必保留此出处 http://zhangjunhd.blog.51cto.com/113473/20629
保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔 本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。 阅读详情

相关推荐

使用Kolla部署多节点Rocky版本OpenStack

openstack命令行客户端使用,post-deploy会在 /etc/kolla/目录下生成文件admin-openrc.sh。每次使用openstack命令时执行source /etc/kolla/admin-openrc.sh(manager节点执行)source /etc/kolla/admin-openrc.sh (将文件内容复制到/etc/profile中,即可一直生效)3.2.2 开始安装kolla-ansible,要带上--ignore-installed PyYAML,否则可能会报错。

gyc1206的博客 1926

servlet和JSP过滤器Filter

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

855

MiniOSD DIY记

最近迷上了航模,研究了很多东西,感觉路走的长了还是适当要停下脚步休息下总结下。 这次DIY的是一块OSD设备,主要用于航模图传的叠加显示,原理也很简单就是atmel atmega328p+MAX7456芯片,网上卖的成品基本上都是一个原理图。 原理图 我按照我自己的需要做了适当的更改,去掉了DC-DC电路,直接用5V输入,因为摄像头都是5V的,所以DC-DC不是很有必要,体积上更加小了点, 打...

memoff的博客 8518

Servlet过滤器,过滤器并不是servlet

 Servlet过滤器是一种小型的、可插入的Web组件,其提供了对Web应用程序的前期处理和后期处理的逻辑控制,可以拦截请求和响应,以便查看、提取或以某种方式操作正在客户端和服务器之间进行交换的数据。Servlet过滤器具有动态、灵活、透明、模块化、可移植、可重用等性质,是一种自包含的,模块化的组件,可以在使用时将其添加到请求/响应链中,也可以被删除而不影响到应用程序的其他Web组件。Servle

傻傻@ 1277

利用树莓派制作智能音箱

利用树莓派制作智能音箱

qq_61803022的博客 1776

语音算法面试复习系列3——语音识别基础 + CTC 详解

摘要:本文系统讲解了语音识别(ASR)的核心算法CTC。主要内容包括:1) ASR的核心挑战是输入音频帧与输出文字序列的对齐问题;2) CTC通过引入blank标记和动态规划算法,无需对齐标注即可训练;3) 详细解析CTC前向算法实现路径概率求和,以及贪心和Beam Search解码方法;4) 指出CTC的条件独立性假设导致无法建模输出依赖关系;5) 对比CTC与传统方法和Attention/Transducer的优缺点,分析实际应用中的subsampling技术。文章包含数学推导、代码实现和面试常见问题,

m0_60605453的博客 305

【JavaWeb】Servlet与过滤器

javaweb中的Servlet与过滤器

低调做人,低调编码,神码都是浮云 1474

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2284

Servlet 过滤器

Servlet 过滤器是 Java Web 应用程序中非常重要的组件,它可以对请求和响应进行拦截和处理。本文将详细介绍 Servlet 过滤器的概念、工作原理、使用场景及实现方式。

m0_73941339的博客 680

SQL面试题——最大连续登陆问题

最大连续登陆是我们计算比较常用的指标,我们可以将其当成一个经典的SQL模型,后面我们也会陆续总结出其他的模型,你还知道其他的比较经典的SQL 吗?欢迎分享,或者你还知道其他的关于计算连续的指标?最大连续登陆重要的是计算思想,最大连续才是关键,登陆只是一个场景,要学会举一反三。

9011

在 SAP HANA 与 HANA Cloud 中,用 SQL DDL 创建数据库视图:从设计时工件到运行时对象的全链路实践

本文介绍了在SAP HANA中通过HDI容器使用DDL定义视图的方法。主要内容包括:1)采用.hdbview设计时工件存储视图定义,构建时自动转换为运行时视图,实现版本控制和权限隔离;2)开发前需准备HDI容器、MTA项目及配置.hdiconfig文件;3)详细说明.hdbview语法结构,重点讲解WITH READ ONLY和WITH STRUCTURED PRIVILEGE CHECK的使用场景;4)提供了从创建文件到构建验证的完整流程示例;5)强调跨容器访问时需通过.hdbgrants为#OO用户授予

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 271

Servlet3.0过滤器

注解 Servlet3.0过滤器        Servlet3.0里面的过滤器跟以前版本的一样,还是需要实现javax.servlet.Filter接口。Filter接口中定义了三个方法,init(FilterConfig filterConfig)、destroy()和doFilter(HttpRequest request, HttpServletResponse response, Fil

Elim的博客 6282

本地部署大模型:dgx-spark-ai项目硬件选型、部署与私有化AI构建指南

大语言模型(LLM)的本地部署是当前AI工程实践中的重要方向,其核心原理在于将模型权重与计算过程完全置于用户可控的硬件环境中。这项技术的核心价值在于实现了数据主权与隐私安全,避免了云端服务的延迟、持续订阅成本及数据外泄风险。从技术实现看,本地部署的关键在于硬件选型与软件环境适配,尤其是NVIDIA GPU的CUDA生态、显存容量与内存带宽的匹配。在应用场景上,本地化部署特别适合对数据敏感性要求高的领域,如企业内部代码助手、金融分析或医疗研究,能够支持私有化模型微调与定制化工作流构建。本文以dgx-spark

weixin_42531579的博客 502

Servlet过滤器,Servlet过滤器创建和配置

Servlet过滤器,Servlet过滤器创建和配置 第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法。 第一方法是过滤器中的init()方法用于对过滤器的初始值进行处理,第二个是destory()方法是过滤器的销毁方法,主要用于释放资源...

HiterCoder 429

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Servlet 编写过滤器

前言 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。 Servlet 过滤器是可用于 Servl...

Yfw的博客 794

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Servlet之过滤器

Servlet之过滤器

qq_52146944的博客 1065

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Servlet过滤器概念

  过滤器是很多Web层框架(特别是对MVC模式的框架,如Struts2...等等)实现的基础,有必要对其进行了解。转自:http://developer.51cto.com/art/200907/134130.htm一、Servlet过滤器的概念:◆Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。 

chaoma96的专栏 1116

Servlet与过滤器

Servlet Server+Applet,是一种服务器端的Java应用程序 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet jsp从莫种意义上来说也是一个servlet 创建Servlet 继承HttpServlet类 Servlet中主要方法以及对象 init():Servlet的初始化方法,仅仅会执行一次 service():处理请求和生成响应 destroy():在服务器停止并且程序中的Servlet对象不再使

mx861656762的博客 781

servlet过滤器 实例_Java Servlet过滤器示例教程

servlet过滤器 实例Java Servlet Filter is used to intercept the client request and do some pre-processing. It can also intercept the response and do post-processing before sending to the client in web appli...

从零开始的教程世界 532

servlet过滤器

一、Servlet过滤器的概念: Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。    Servlet过滤器本身并不产生请求和响应对象,它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Re

Morning_Haze的博客 555
上一篇: Java堆和栈的区别
下一篇: Servlet过滤器原理分析
北斗安心联
博客等级 码龄16年 6粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值