Servlet过滤器

本文详细介绍了Servlet过滤器的概念、基本原理及其开发步骤。通过具体的代码示例,展示了如何实现一个简单的过滤器,包括请求和响应的处理过程。此外,还介绍了如何在过滤器中使用Servlet初始化参数。
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
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点探讨其系统建模控制策略,结合Matlab代码Simulink仿真实现。文章详细分析了无人机的动力学模型,特别是引入螺旋桨倾斜机构后带来的全驱动特性,使其在姿态位置控制上具备更强的机动性自由度。研究涵盖了非线性系统建模、控制器设计(如PID、MPC、非线性控制等)、仿真验证及动态响应分析,旨在提升无人机在复杂环境下的稳定性和控制精度。同时,文中提供的Matlab/Simulink资源便于读者复现实验并进一步优化控制算法。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真经验的研究生、科研人员及无人机控制系统开发工程师,尤其适合从事飞行器建模先进控制算法研究的专业人员。; 使用场景及目标:①用于全驱动四旋翼无人机的动力学建模仿真平台搭建;②研究先进控制算法(如模型预测控制、非线性控制)在无人机系统中的应用;③支持科研论文复现、课程设计毕业课题开发,推动无人机高机动控制技术的研究进展。; 阅读建议:建议读者结合文档提供的Matlab代码Simulink模型,逐步实现建模控制算法,重点关注坐标系定义、力矩分配逻辑及控制闭环的设计细节,同时可通过修改参数和添加扰动来验证系统的鲁棒性适应性。
### Servlet 过滤器的配置及使用方法 #### 1. 创建过滤器过滤器类需要实现 `javax.servlet.Filter` 接口,并重写其三个核心方法:`init`、`doFilter` 和 `destroy`。 - **`init` 方法**:在服务器启动时被调用,主要用于加载配置文件初始化资源[^1]。 - **`doFilter` 方法**:这是过滤器的核心部分,用于拦截并处理请求和响应对象。可以在这里添加自定义逻辑,比如编码设置、权限验证等[^1]。 - **`destroy` 方法**:当服务器关闭时被调用,用于释放过滤器所占有的资源[^1]。 以下是一个简单的过滤器类示例: ```java import javax.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,例如读取配置参数 String param = filterConfig.getInitParameter("exampleParam"); System.out.println("初始化参数:" + param); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在这里可以对请求进行预处理 System.out.println("请求前的操作"); // 继续传递给下一个过滤器目标资源 chain.doFilter(request, response); // 在这里可以对响应进行后处理 System.out.println("响应后的操作"); } public void destroy() { // 清理工作 System.out.println("销毁过滤器"); } } ``` --- #### 2. 配置过滤器 可以通过两种方式来配置过滤器:基于 XML 的配置和基于注解的配置。 ##### (1) 基于 XML 的配置 通过 `web.xml` 文件中的 `<filter>` 和 `<filter-mapping>` 标签完成过滤器的注册和映射。 - **<filter> 标签**:定义过滤器的名称及其对应的类名。 - **<filter-mapping> 标签**:指定哪些 URL 请求会被该过滤器拦截。 示例配置如下: ```xml <filter> <filter-name>ExampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> <!-- 可选:定义初始化参数 --> <init-param> <param-name>exampleParam</param-name> <param-value>value</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 在这个例子中,所有匹配 `/secure/` 路径的请求都会经过 `ExampleFilter` 处理[^4]。 ##### (2) 基于注解的配置 如果使用的 Servlet 容器支持 Servlet 3.0 更高版本,则可以直接使用 `@WebFilter` 注解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值