- 浏览: 90295 次
最新评论
-
守望者:
我也是出现了同样的错误,应该不是楼上这位仁兄说的Tomcat的 ...
appfuse 1.9.4 错误 -
huanghero0663:
不是tomcat的问题,而是你在电脑上的环境变量写错了,app ...
appfuse 1.9.4 错误
1、Servlet Filter概述
凡是开发过J2EE的web application的人员都知道,经常需要处理以下几种情况:
访问特定资源(Web 页、JSP 页、servlet)时的身份认证
应用程序级的访问资源的审核和记录
应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上
对被访问资源的及时转换, 包括从 servlet 和 JSP 的动态输出
在servlet2.3之前这些功能处理是很难实现的,但是Java Servlet 2.3 规范新增了不少激动人心的功能,其中之一便是过滤器(Filter),其实这就是我们所说的管道和过滤器体系架构在J2EE中的应用实践. 通过使用该模式使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。其结构图如下:
一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:
init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数。
doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。
destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。
2、Filter链介绍
所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。WebApplication可以指定许多过滤器来完成相关的工作.那么它们就组成一个过滤器链来完成相应的工作.其结构如下图:
3、例子
3.1 简单filter
在PetStore1.3.1中的就存在两个Filter过滤器.其中一个过滤器,完成字符集的编码的转化,如大家经常遇到的汉字编码问题,你只需配置为GBK即可.它从Web.xml之中读取这些参数的配置信息,然后进行编码的转化.另一个是安全校验Fliter,它负责进行安全检查哪些页面可以进行,哪些不可。它们组成一个Filter链,结构图和实现代码如下:
public class EncodingFilter implements Filter { private FilterConfig config = null; // default to ASCII private String targetEncoding = "ASCII"; public void init(FilterConfig config) throws ServletException { this.targetEncoding = config.getInitParameter("encoding"); } //在过滤器中实现字符集编码转化 public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)srequest; request.setCharacterEncoding(targetEncoding); // move on to the next chain.doFilter(srequest,sresponse); } public void destroy() { ................. } } public class SignOnFilter implements Filter { public void init(FilterConfig config) throws ServletException { this.config = config; URL protectedResourcesURL = null; try { protectedResourcesURL = config.getServletContext().getResource("/WEB-INF/signon-config.xml"); ............... } catch (java.net.MalformedURLException ex) { System.out.println("SignonFilter: malformed URL exception: " + ex); } } public void destroy() { config = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ........ } } |
容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关:<filter> 和 <filter-mapping>。<filter> 标记是一个过滤器定义,它必定有一个 <filter- name> 和 <filter-class> 子元素。<filter-name> 子元素给出了一个与过滤器实例相关的名字。<filter-class> 指定了由容器载入的实现类。您能随意地包含一个 <init-param> 子元素为过滤器实例提供初始化参数。<filter-mapping> 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。
<!-- Encoding Filter Declaration Start --> <filter> <filter-name>EncodingFilter</filter-name> <display-name>Encoding Filter</display-name> <description>no description</description> <filter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- Encoding Filter Declaration End --> <!-- Signon Filter Declaration Start --> <filter> <filter-name>SignOnFilter</filter-name> <display-name>SignOn Filter</display-name> <description>no description</description> <filter-class>com.sun.j2ee.blueprints.signon.web.SignOnFilter</filter-class> </filter> <!-- Signon Filter Declaration End --> <!-- Encoding Filter Mapping Start--> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Encoding Filter Mapping End --> <!-- Signon Filter Mapping Start--> <filter-mapping> <filter-name>SignOnFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Signon Filter Mapping End --> |
3.2 复杂的filter
上面是petstore的例子,演示了通过Fliter修改字符编码和安全认证的功能。下面提供一个示例演示通过修改返回数据(通过过滤器把response的字符串变成大写)。
public class UCaseResponse extends HttpServletResponseWrapper { public UCaseResponse(HttpServletResponse response) { super(response); } public PrintWriter getWriter() throws IOException { return new UCaseWriter(super.getWriter()); } } public class UCaseWriter extends PrintWriter { public UCaseWriter(Writer out) { super(out); } public void write(int c) { super.write(Character.toUpperCase( (char) c)); } public void write(char buf[], int off, int len) { for (int i = 0;i < len;i++) { write(buf[off + i]); } } public void write(String s, int off, int len) { for (int i = 0;i < len;i++) { write(s.charAt(off + i)); } } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { filterChain.doFilter(request, new UCaseResponse((HttpServletResponse)(response))); }catch(Exception sx) { filterConfig.getServletContext().log(sx.getMessage()); } |
该示例使用HttpServletResponseWrapper技术,它是对HttpServletResponse的包装,其实就是装饰(decorate)设计模式的应用.这个例子能够工作的关键是UCaseResponse和UCaseWriter类,它实现了对每个要输出的字符都转成了大写后再写入实际的输出流的功能。
4、体系架构的实现
实现一个管道和过滤器一般要注意以下几个方面:
把系统任务分成一系列处理阶段。
根据管道和过滤器的设计方案,必须把系统处理的任务分割成相应独立的任务,如日志,数据转化,安全认证等。这样每个阶段仅依赖其前一阶段的输出。通过数据流将所有阶段相连起来。并且你可以进行替换每个步骤,或者可以调整它们之间的顺序,以产生新的结果.如petstore中的编码转化Filter和安全Filter,分成两个独立的处理阶段。
定义沿每个管道传输的数据格式。
我们知道每个过滤器,定义一个统一格式以获得最大的灵活性,因为它使过滤器的重组变得容易。如:每个过滤器的方法是doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)它们的参数是必须相同的。
决定如何实现每个管道连接
Filter过滤器的连接是推得方式来实现的.前一个过滤器主动的调用filterChain.doFilter(request, response);来实现转向下一个过滤器。
设计和实现过滤器
设计每个Filter具有独立的功能,如编码转化,安全校验,等功能.并且每个Fliter都应该在实现javax.servlet.Filter接口。
建立处理流水线
过滤器的部署是在Web.xml中进行配置,描述过滤器的实现类以及它们的map关系,来确定它们的顺序。
其他应用实例
1、JBOSS
如果大家对EJB了解,应该知道客户调用EJB实际上并不是直接引用EJB实例(ejb instance).它通过容器来截获客户端的请求,然后按照EJB描述符做些许多相应的工作如,安全校验,事务的处理,线程并发处理等.这样就可以使开发人员仅关心自己的业务逻辑,而不需对复杂的基础服务进行实现.使开发人员从繁琐的工作中解脱出来.集中精力处理自己的业务逻辑,它的结构图如下:
笔者有幸阅读了JBOSS的源码,分析了Jboss的EJB容器的实现. EJB的容器通过许多拦截器(Inteceptor)来实现,每个拦截器处理一定的功能,一个处理结束后转发给下一个拦截器,最后一个拦截器才把真正调用EJB的实例.其中它的EntityBean 容器的拦截器的结构如下:
我们看其中的log拦截器
public class LogInterceptor extends AbstractInterceptor{ public Object invoke(Invocation invocation) throws Exception { boolean trace = log.isTraceEnabled(); // Log call details if (callLogging) { ......进行log的处理 } //处理结束,把请求转发给下一个拦截器 return getNext().invoke(invocation); } |
这些拦截器配置在standardjboss.xml文件中,如下:
<container-interceptors> <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor> <interceptor metricsEnabled="true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor> </container-interceptors> |
这就是Jboss容器架构最巧妙的地方,最初这个架构就是由天才少年Rickard Oberg提出的.其实这个架构就应用我们讨论的管道和过滤器模式,其实每个拦截器就是一个过滤器,使用该模式给Jboss带来了如下的好处:
使系统的架构更容易理解,因为每个过滤器完成单一的功能。
使系统更加模块化,有利于系统的模块重用和扩展,如果系统想增加某种功能只需增加一个实现Interceptor接口的拦截器,然后配置在standardjboss.xml文件中即可。
使系统的容易进行错误处理,如果在一个拦截器中发现错误(error)或者异常(exception),只需返回即可.
2、AXIS
无独有偶,同样在Axis上也应用了管道和过滤器模式.Aixs是apache开源的webservice实现服务器。简单的说,axis就是处理Message,它首先截获客户端的请求,然后转发到真正的实现业务逻辑上处理客户端的请求,在这之前经过一系列的handler处理.它的结构很像EJB容器.其实就是管道和过滤器模式的应用,Handler就是过滤器.它的处理顺序主要考虑两个方面一个是部署描述符(deployment configuration )另一个就是是客户端还是服务器端。Handler处理的对象是MessageContext它的由3个重要的部分组成,一是一个request Message,一个是response message,还有许多属性。
我们经研究源码分析,在服务器端,有一个Transport Listener 它监听客户端的请求, 可以通过多种协议,一旦有客户请求,它将按照协议的规范把数据解析生成生成一个Message对象,然后把它设置到MessageContext,然后调用一系列的Handler进行处理。
其结构图如下:
相关设计模式
在使用管道和过滤器模式时,一般会使用以下的GOF设计模式。
1、职责链模式(Chain Of Responsibility)
职责链设计模式的意图就是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其实管道和过滤器模式就是职责链模式的抽象,把它应用到软件体系架构中。
2、 命令模式(Command)
命令模式的意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。在管道和过滤器模式中每个过滤器一般使用命令模式,把请求封装成一个命令进行处理。
3、装饰模式(Decorator)
装饰模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
在管道和过滤器模式中,在每个过滤器中经常需要对请求进行动态的增加功能,或者修改请求的内容,这时一般会使用装饰模式.如Servlet filter的javax.servlet.http.HttpServletRequestWrapper, javax.servlet.http.HttpServletResponseWrapper就是装饰模式的应用.
总结
本文讨论了管道和过滤器模式的解决方案,以及它的优缺点.然后以J2EE规范的Servlet Filter为例详细介绍了怎样应用该模式,同时简单的介绍了在Jboss,Axis中的应用。
struts中文的解决 filter的一种用法
1.使ApplicationResources.properties支持中文
建立一个ApplicationResources_ISO.properties文件,把应用程序用的message都写进去,然后在dos下执行这个命令,
native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties
这样就会将ISO编码的ApplicationResources转换成GB2312编码的格式了,同时保存到ApplicationResources.properties.
native2ascii这个工具是jdk自带的一个东东,所以如果path都设定正确就可以直接运行了,你可以在$java_home$/bin下找到他。
转换后的中文类似于这个样子
iso 格式下 :tj.type=商品车类型
gb2312格式下 :tj.type=\u5546\u54c1\u8f66\u7c7b\u578b
然后在struts-config.xml中设置应用这个资源文件
<message-resources parameter="com.huahang.tj.ApplicationResources" key="org.apache.struts.action.MESSAGE"></message-resources>
开发jsp时在jsp的开头写上<!---->,将字符集设置成gb2312就可以了。
2.使数据库操作支持中文。
数据库操作支持中文一直让我比较头痛,但是感谢善解人衣向我推荐了www.chinaxp.org,这个网站是用struts框架开发的,而且
开放源码,下载了源码后发现它的中文处理得很好,阅读部分源码,没有发现什么特殊的字符集转换,很纳闷,偶然看到楼上网友
留言知道原来servlet可以统一设置字符转换。chinaxp.org就是这么做的。
在web.xml中加上
- <filter>
- <filter-name>Set Character Encoding</filter-name>
- <filter-class>com.huahang.tj.struts.filters.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GB2312</param-value>
- </init-param>
- <init-param>
- <param-name>ignore</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Set Character Encoding</filter-name>
- <servlet-name>action</servlet-name>
- </filter-mapping>
这里会涉及一个bean,源码如下:
- /*
- * XP Forum
- *
- * Copyright (c) 2002-2003 RedSoft Group. All rights reserved.
- *
- */
- package com.huahang.tj.struts.filters;
- import javax.servlet.*;
- import java.io.IOException;
- /**
- * <p>Filter that sets the character encoding to be used in parsing the
- * incoming request, either unconditionally or only if the client did not
- * specify a character encoding. Configuration of this filter is based on
- * the following initialization parameters:</p>
- * <ul>
- * <li><strong>encoding</strong> - The character encoding to be configured
- * for this request, either conditionally or unconditionally based on
- * the <code>ignore</code> initialization parameter. This parameter
- * is required, so there is no default.</li>
- * <li><strong>ignore</strong> - If set to "true", any character encoding
- * specified by the client is ignored, and the value returned by the
- * <code>selectEncoding()</code> method is set. If set to "false,
- * <code>selectEncoding()</code> is called <strong>only</strong> if the
- * client has not already specified an encoding. By default, this
- * parameter is set to "true".</li>
- * </ul>
- *
- * <p>Although this filter can be used unchanged, it is also easy to
- * subclass it and make the <code>selectEncoding()</code> method more
- * intelligent about what encoding to choose, based on characteristics of
- * the incoming request (such as the values of the <code>Accept-Language</code>
- * and <code>User-Agent</code> headers, or a value stashed in the current
- * user's session.</p>
- *
- * @author <a href="mailto:jwtronics@yahoo.com">John Wong</a>
- *
- * @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $
- */
- public class SetCharacterEncodingFilter implements Filter {
- // ----------------------------------------------------- Instance Variables
- /**
- * The default character encoding to set for requests that pass through
- * this filter.
- */
- protected String encoding = null;
- /**
- * The filter configuration object we are associated with. If this value
- * is null, this filter instance is not currently configured.
- */
- protected FilterConfig filterConfig = null;
- /**
- * Should a character encoding specified by the client be ignored?
- */
- protected boolean ignore = true;
- // --------------------------------------------------------- Public Methods
- /**
- * Take this filter out of service.
- */
- public void destroy() {
- this.encoding = null;
- this.filterConfig = null;
- }
- /**
- * Select and set (if specified) the character encoding to be used to
- * interpret request parameters for this request.
- *
- * @param request The servlet request we are processing
- * @param result The servlet response we are creating
- * @param chain The filter chain we are processing
- *
- * @exception IOException if an input/output error occurs
- * @exception ServletException if a servlet error occurs
- */
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain)
- throws IOException, ServletException {
- // Conditionally select and set the character encoding to be used
- if (ignore || (request.getCharacterEncoding() == null)) {
- String encoding = selectEncoding(request);
- if (encoding != null)
- request.setCharacterEncoding(encoding);
- }
- // Pass control on to the next filter
- chain.doFilter(request, response);
- }
- /**
- * Place this filter into service.
- *
- * @param filterConfig The filter configuration object
- */
- public void init(FilterConfig filterConfig) throws ServletException {
- this.filterConfig = filterConfig;
- this.encoding = filterConfig.getInitParameter("encoding");
- String value = filterConfig.getInitParameter("ignore");
- if (value == null)
- this.ignore = true;
- else if (value.equalsIgnoreCase("true"))
- this.ignore = true;
- else if (value.equalsIgnoreCase("yes"))
- this.ignore = true;
- else
- this.ignore = false;
- }
- // ------------------------------------------------------ Protected Methods
- /**
- * Select an appropriate character encoding to be used, based on the
- * characteristics of the current request and/or filter initialization
- * parameters. If no character encoding should be set, return
- * <code>null</code>.
- * <p>
- * The default implementation unconditionally returns the value configured
- * by the <strong>encoding</strong> initialization parameter for this
- * filter.
- *
- * @param request The servlet request we are processing
- */
- protected String selectEncoding(ServletRequest request) {
- return (this.encoding);
- }
- }//EOC
加上这个后,在action中就可以直接从form中接收gb2312编码的数据了,返回时自然也是gb2312了。
但是这个好像需要servlet 2.2以上的容器
发表评论
-
出现java.lang.UnsupportedClassVersionError 错误的原因
2007-04-18 13:55 2324出现java.lang.UnsupportedClassVer ... -
log4cplus学习笔记(二)
2007-03-27 13:11 8893log4cplus在很多方面做的都很出色,但是使用过程有些地 ... -
log4cplus学习笔记(一)
2007-03-27 13:00 59361(一)log4cplus是C++编写的开源的日志系统,功能非常 ... -
Java基础知识总结
2007-02-08 16:32 181、对象的初始化 ... -
Java及相关字符集编码问题研究
2007-01-09 10:45 12411. ... -
编写安全的Java代码
2007-01-09 09:54 1322本文是来自Sun官方站点的一篇关于如何编写安全的Java代码的 ... -
Filter的作用
2006-12-14 15:27 10180你可以在两种情况下使用本文: ·学习过滤器的功用, ·作为你写 ... -
java 日期的处理2
2006-12-12 11:22 63cal1.add(Calendar.WEEK_OF_ ... -
关于Oracle9i日期格式几点要说明的问题
2006-12-12 11:02 751. 在 Oracle9i 之前, 日期格式的数据类型默认格式 ... -
java 日期的处理1
2006-12-12 11:22 40java中常见的日期时间类 Date 类 最基础的日期时间 ... -
SQL语句集
2006-12-12 10:35 62--语 句 功 能 --数据操作 S ... -
JDBC
2006-12-11 11:47 54java 代码 String strDri ...
相关推荐
### Filter学习心得 #### 一、Filter概述与作用 Filter(过滤器)是Java Web开发中的一个重要组件,它主要用于拦截用户请求,在请求达到目标资源(如Servlet或JSP页面)之前进行预处理,或者在响应返回客户端之前...
### Duanxx的OpenCV学习:filter2D使用说明 #### 概述 在计算机视觉领域,OpenCV(开源计算机视觉库)是一个广泛使用的库,它提供了大量的算法和功能来处理图像和视频数据。其中,`filter2D`函数是一个非常重要的...
本资料为“Kalman filter 学习源代码”,主要面向正在学习或研究卡尔曼滤波器的人员,提供实践操作和理解的参考。由Kevin Murphy编写的Kalman filter toolbox是一个用Matlab实现的工具箱,它包含了各种类型的卡尔曼...
2. **参数调整**:在FilterPro中,用户可以通过直观的图形界面调整滤波器的阶数、通带截止频率、阻带衰减等参数,实时观察频率响应变化,以实现最佳性能。 3. **滤波器比较**:FilterPro允许同时设计和比较多个...
这个压缩包文件“bloom filter布隆过滤器学习资料大全”显然是一个关于布隆过滤器的资源集合,包含了相关的论文和变种总结,对于学习和理解这一技术非常有帮助。 布隆过滤器的核心思想是通过多个哈希函数将元素映射...
JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤JavaWeb-过滤器Filter...
卡尔曼滤波算法(Kalman Filter)是一种在线性高斯噪声环境下的最优估计方法,广泛应用于信号处理、控制工程、导航、航空航天、图像处理等多个领域。它的核心思想是结合系统模型和观测数据,通过数学推理来估计系统...
2. QueryFilter:基于另一个Query来过滤结果,只有同时匹配原Query和Filter的文档才会被返回。 3. CachingWrapperFilter:缓存过滤结果,避免对同一个Filter的重复计算,提高效率。 4. DocsFilter:用于限制搜索结果...
标题中的"filter学习资料"指的是Java Web开发中的Servlet Filter技术,它是Java Servlet API的一部分,用于在请求被Servlet处理之前或之后进行拦截和处理。Filter的主要功能包括数据过滤、权限控制、日志记录等,它...
总的来说,“RF filter.rar”是一个综合性的射频滤波器学习资源,包含了多种滤波器类型和设计考虑,适合不同水平的读者学习和参考。通过对这些内容的深入研究,可以提升对射频滤波器设计的理解和实践能力。
在IT行业中,驱动程序开发是操作系统与硬件之间的重要桥梁,其中Filter驱动开发是特定的一种,主要涉及对系统...通过学习和实践,开发者能够创建出满足特定需求的Filter驱动,从而在系统层面实现高效、安全的功能扩展。
《filter在线学习》资源集合包含了丰富的filter学习材料,旨在帮助我们深入理解和掌握这一重要的技术概念。Filter,中文常称为滤波器,是信号处理、数据处理领域中的核心工具,广泛应用于音频处理、图像处理、通信...
在IT领域,尤其是在Web开发中,`FilterBuilder`是一个重要的工具,它允许用户...通过学习和应用`FilterBuilder`,开发者可以提升其在Web应用程序中处理数据过滤和查询的能力,为用户提供更高效、更直观的数据操作工具。
2. **使用示例**:初学者可以从软件自带的示例开始,学习不同滤波器的设计方法和参数调整。 3. **保存和加载项目**:设计过程中,定期保存项目以防意外丢失。如果需要继续之前的工作,可以加载已保存的项目文件。 ...
2. 添加Renderer Filter:根据要播放的媒体类型(视频或音频),选择合适的Renderer,如Video Render Filter或Audio Render Filter。 3. 添加Source Filter:Source Filter负责获取媒体数据,可以是文件源、网络源...
j2ee学习系列二 Filter 提供学习
标题中的"Filter"一词在IT领域...如果博客中有更具体的讨论,例如Filter的高级特性、自定义Filter实现或是与其他技术的结合,那么这些都需要通过原文链接进行深入学习。如果你需要更详细的信息,建议直接访问博文链接。
FilterPro是一款由德州...通过学习和实践,你可以利用它来快速准确地设计满足特定需求的滤波器电路,大大提高你的工作效率。结合提供的教程资源,你将能够逐步掌握滤波器设计的核心技巧,进一步提升你的电子工程技能。
2. **Filter配置**: 在`web.xml`中,我们通过`<filter>`和`<filter-mapping>`元素定义Filter。`<filter>`元素定义Filter的类名,而`<filter-mapping>`则指定Filter应该拦截哪些URL模式。 3. **Filter链**: 当有...