servlet过滤/监听

Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤、判断用户的登录状态。过滤器使得Servlet开发者能够在客户端请求到达 Servlet资源之前被截获,在处理之后再发送给被请求的Servlet资源,并且还可以截获响应,修改之后再发送给用户。而Servlet监听器可以  监听客户端发出的请求、服务器端的操作,通过监听器,可以自动激发一些操作,如监听在线人数。

  Servlet过滤器简介绍

     Servlet过滤器是在Java Servlet 2.3 规范中定义的,它是一种可以插入的Web组件,它能够对Servlet 容器的接收到的客户端请求和向客户端发出的响应对象进行截获,过滤器支持对Servlet程序和JSP页面的基本请求处理功能,如日志、性能、安全、会话  处理、XSLT转换等。

    Servlet过滤器本身不产生请求和响应,它只提供过滤作用,Servlet过滤器能够在Servlet程序(JSP页面)被调用之前检查  request对象,修改请求头和请求内容,在Servlet程序(JSP页面)被调用之后,检查response对象,修改响应头和响应内容。

Servlet过滤器的特点:
      1.Servlet过滤器可以检查和修改request和response对象。 
  
      2.Servlet过滤器可以被指定与特定的URL关联,只有当客户请求访问该特定的URL时,才会触发过滤器。
  

      3.Servlet过滤器可以被串联成串,形成过滤链,协同修改请求和响应。

Servlet过滤器的作用如下:
  
      1.查询请求并作出相应的行动。
      2.阻塞请求--响应对,使其不能进一步传递。
      3.修改请求头和内容,用户可以提供自定义的请求。
      4.修改响应头和内容,用户可以通过提供定制的响应版本实现。

      5.与外部资源进行交互。

Servlet过滤器的体系结构
      Servlet过滤器用于拦截传入的请求和传出的响应,并监视、修改或以某种方式处理 正在通过的数据流。Servlet过滤器是自包含、模块化的组件,可以将它们添加到请求/响应过滤链中,或者在不影响应用程序中其它Web组件的情况下删 除它们。Servlet过滤器只在改动请求和响应的运行时处理,因而不应该将它们之间嵌入到Web应用程序框架,除非是通过Servlet API中良好定义的标准接口来实现。
  
      Web资源可以配置成为没有过滤器与之关联(默认情况)、与单个过滤器关联(典型情况),甚至是与一个过滤器链关联。其功能与Servlet一 样,主要是接收请求和响应对象,然后过滤器会检查请求对象,并决定是将该请求转发给链中的下一个过滤器,还是终止该请求并直接向客户端发会一个响应,如果  请求被转发了,它将被传递给过滤链中的下一个过滤器,或者Servlet程序(JSP页面),在这个请求通过过滤器链并被服务器处理后,一个响应将以相反 的顺序通过该过滤链发送回去,这样就给每个Servlet过滤器提供了根据需要处理响应对象的机会。
  
      当过滤器在Servlet 2.3规范中首次引入时,只能过滤客户端和客户端所访问的指定Web资源之间的内容(请求/响应),如果该Web资源将请求转发给其它Web资源时,那就  不能向幕后委托的任何请求应用过滤器。Servlet 2.4 规范消除了这个限制,Servlet过滤器现在可以应用于J2EE Web环境中存在请求和响应的任何地方。可见,Servlet过滤器可以应用在客户端和Servlet程序之间、Servlet程序和Servlet程序 之间、Servlet程序和JSP页面之间、JSP页面和JSP页面之间,具有强大的能力和灵活性。
  
                                                                   
  
  2.1 Servlet过滤器对请求的过滤
      Servlet过滤器对请求的过滤过程如下:
  
      1.Servlet容器创建一个Servlet过滤器实例。
      2.Servlet过滤器实例调用init()方法得到初始化参数。
      3.Servlet过滤器实例调用doFilter()方法,根据初始化参数的值判断该请求是否合法,如果该请求不合法,则阻塞该请求,如果是合法请求,则调用chain.doFilter(request,response)方法将该请求向后转发。
  
  2.2 Servlet过滤器对响应的过滤
      Servlet过滤器对响应的过滤过程如下:
      1.过滤器截获客户端的请求。
      2.重新封装ServletResponse,在封装后的ServletResponse中提供客户端自定义的输出流。
      3.将请求向后转发。
      4.Web组件产生响应。
      5.过滤器从被封装的ServletResponse中获取客户自定义的输出流。
      6.将响应内容通过客户自定义的输出流写入缓冲流。
      7.在缓冲流中修改响应内容后清空缓冲流,输出响应内容。
  
  2.3 Servlet过滤器的发布 

      Seevlet过滤器设计完毕之后,必须对该过滤器进行发布(配置), 发布一个Servlet过滤器时,必须在项目的web.xml文件中加入<filter>元素和<filter- mapping>元素,<filter>元素用来定义一个过滤器,该元素的属性有:

    

属性

描述

filter-name

指定过滤器的名字

filter-class

指定过滤器类

init-param

指定过滤器的初始化参数

<filter-mapping>元素用于将过滤器与URL关联,其属性有:

属性

描述

filter-name

指定过滤器的名字

url-pattern

指定与过滤器关联的URL

 实现一个Servlet过滤器
  3.1 Servlet过滤器接口的构成
      所有的Servlet过滤器都必须实现javax.servlet.filter接口,该接口中定义了3个过滤器必须实现的方法:
  
      1.
void  init(FilterConfig) :过滤器的初始化方法,Servlet容器在创建过滤器实例时调用这个方法,在这个方法中可以读出在web.xml文件中为该过滤器配置的初始化参数。
  
      2.
voiddoFilter(ServletRequest,ServletResponse,FilterChain) :用于完成实际的过滤操作,当客户请求访问与过滤器相关联的URL时,Servlet容器将先调用过滤器的这个方法,FilterChain参数用于访问后续过滤器。
  
      3.
voiddestroy() :过滤器在被取消前执行这个方法,释放过滤器申请的资源。
  
  3.2 Servlet过滤器的创建步骤
      创建一个Servlet过滤器需要下面的步骤:
      
      1.创建一个实现了javax.servlet.Filter接口的类。
  
      2.重写init(FilterConfig)方法,读入为过滤器配置的初始化参数,申请过滤器需要的资源。
  
      3.重写方法doFilter(ServletRequest,ServletResponse,FilterChain),完成过滤操作,可以  从ServletRequest参数中得到全部的请求信息,从ServletResponse参数中得到全部的响应信息。
  
      4.在doFilter()方法的最后,使用FilterChain参数的doFilter()方法将请求和响应后传。
  
      5.对响应的Servlet程序和JSP页面注册过滤器,在部署描述文件(web.xml)中使用<filter-apping>和<filter>元素对过滤器进行配置。
  
  3.3 编写过滤器类
      在过滤器中,需要使用3个简单的接口,它们是:分别是Filter、FilterChain、FilterConfig,全部包含在
javax.servlet 包中。从编程的角度看,过滤器类要实现 Filter 接口,然后使用实现了FilterChain和FilterConfig接口的对象来工作,FilterChain对象负责将请求和响应后传,FilterConfig对象负责为过滤器读初始化参数。
  
      为了与过滤器的三步模式(创建、工作、撤消)保持一致,过滤器必须重写Filter接口中的三个方法:
  
      
init() :在容器实例化过滤器市时被调用,主要为过滤器做初始化,该方法有一个FilterConfig类型的形参。
  
      
doFilter() :这个方法用来完成真正的过滤操作,它有3个形式参数:ServletRequest参数包含请求信息,ServletResponse参数包含响应信息,FilterChain参数用来将请求和响应向后传递。
  

      destroy():过滤器被撤消时调用这个方法,释放过滤器所 占有的资源

------------------------------------------------------------------------------------------------------------------

Servlet监听器

      Servlet监听器也叫做 listener,通过它可以监听Web应用的上下文(环境)信息、Servlet请求信息、Servlet会话信息,并自动根据不同情况,在后台调用相  应的处理程序。通过监听器,可以自动激发一些操作,比如监听在线人数,当增加一个HttpSession时就激发 sessionCreated(HttpSessionEvent)方法,这样就可以给在线人数加1。
  
  13.5.1 监听器的原理
      Servlet监听器是Web应用开发的一个重要组成部  分,Servlet监听器是在Servlet2.3规范中和Servlet过滤器一起引入的。在 Servlet2.4 规范中对其进行了比较大的改进。主要就是用来对Web应用进行监督和控制,极大地增强了Web应用的事件处理能力。
  
      Servlet监听器的功能比较类似于Java中的GUI程序的监听器,可以监听由于Web应用中的状态改变而引起的Servlet容器产生的相应事件,然后接收并处理这些事件。
  
  5.2 监听器的类型
      在 Servlet 2.4 规范中,根据监听对象的类型和范围,将监听器分为3类:
ServletRequest 监听器(请求监听器)、HttpSession 监听器(会话监听器)、ServletContext 监听器(上下文监听器),其中请求监听器(ServletRequest 监听器)是  Servlet 2.4 规范中新增加的监听器,可以用来监听客户的端请求,在Servlet 2.4 规范中包含了8个监听器接口和6个监听器事件类,具体的监听器接口和事件如下表:

监听对象

监听接口

监听事件

ServletRequest

ServletRequestListener    (2个方法)

ServletRequestEvent

ServletRequestAttributeListener    (3个方法)

ServletRequestAttributeEvent

HttpSession

HttpSessionListener    (2个方法)

HttpSessionEvent

HttpSessionActivationListener    (2个方法)

HttpSessionAttributeListener    (3个方法)

HttpSessionBindingEvent

HttpSessionBindingListener    (2个方法)

ServletContext

ServletContextListener    (2个方法)

ServletContextEvent

ServletContextAttributeListener    (3个方法)

ServletContextAttributeEvent

    1.被监听对象ServletContext
      对ServletContext对象(JSP页面中称为application对象)实现监听涉及2个接口:
  
      (1)
ServletContextListener接口:用于监听ServletContext对象的创建和删除:接口中定义的回调方法有:
  
          当创建一个ServletContext对象时,激发  
contextInitialzed(ServletContextEvent)方法。
          当撤消一个ServletContext对象时,激发  
contextDestroyed(ServletContextEvent)方法。
  
      (2)
ServletContextAttributeListener接口:用于监听ServletContext对象的属性操作。接口中定义的回调方法有:
  
          增加属性时,激发 
attributeAdded(ServletContextAttributeEvent)
          删除属性时,激发 attributeRemoved(ServletContextAttributeEvent) 
          修改属性时,激发 
attributeReplaced(ServletContextAttributeEvent) 
  
      
2.被监听对象HttpSession
      对HttpSession对象(session)实现监听涉及4个接口:
  
      (1)
HttpSessionListener接口:这个接口监听Http会话的创建和撤消,并在某个session对象建立和销毁之前调用某个方法。接口中定义的回调方法有:
  
          创建一个session对象时,激发  
sessionCreated(HttpSessionEvent)
          删除一个session对象时,激发 sessionDestroyed(HttpSessionEvent)
  
      (2)
HttpSessionActivationListener接口:监听Http会话的active和passivate状态。接口中定义的回调方法有:
  
          session对象被保存到磁盘时,激发 
sessionWillPassivate(HttpSessionEvent)
          session对象被调入内存时,激发 sessionDidActivate(HttpSessionEvent)
  
      Activate与Passivate是用于置换session对象的动作,当Web服务器因为资源利用或负载平衡等原因要将内存中的 session对象暂时储存至硬盘或其它储存器时(通过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加 载到JVM中时所采的动作称之为Activate。sessionDidActivate()方法与 sessionWillPassivate()方法分别于Activeate后与Passivate前被调用。 
  
      (3)
HttpSessionAttributeListener接口:监听Http会话中属性的设置信息。接口中定义的回调方法有:
  
          向某个session对象中增加新属性时,激发  
attributeAdded(HttpSessionBindingEvent)
          删除某个session对象中的属性时,激发 attributeRemoved(HttpSessionBindingEvent)
          修改某个session对象中的属性时,激发 attributeReplaced(HttpSessionBindingEvent)
  
      使用HttpSessionBindingEvent事件类对象的getSession()方法可以得到这个session对象,使用 HttpSessionBindingEvent对象的getName()方法得到属性的名字,使用getValue()方法得到属性的值。
  
      若有属性加入到某个会话(HttpSession)对象,则会调用attributeAdded(),同理在替换属性与移除属性时,会分别调用attributeReplaced()、attributeRemoved()。

    (4)HttpSessionBindingListener接口:这是唯一一个不需要在web.xml中进行配置的监听器接口,监听Http会话中属性的变化情况。接口中定义的回调方法有:
  
          属性被加入到session中时,激发属性的 
valueBound(HttpSessionBindingEvent)
          属性被从session中删除时,激发属性的 valueUnbound(HttpSessionBindingEvent)
  
      使用HttpSessionBindingEvent事件类对象的getSession()方法可以得到这个session对象,使用 HttpSessionBindingEvent对象的getName()方法得到属性的名字,使用getValue()方法得到属性的值。
  
      如果一个对象object实现了HttpSessionBindingListener接口时,当把object对象保存到session中时, 就会自动调用object对象的valueBound()方法,如果对象object被从session(HttpSession)移除时,则会调用 object对象的valueUnbound()方法。使用这个接口,可以让一个对象自己知道它自己是被保存到了session中,还是从session 中被删除了。     
      
      
3.被监听对象ServletRequest
      对ServletRequest对象(request)实现监听涉及2个接口:
  
      (1)
ServletRequestListener接口:监听请求的创建和撤消,该接口用来监听请求到达和结束,因此可以在请求达到前和请求结束前执行一些用户行为。  接口中定义的回调方法有: 
  
      请求对象初始化时,激发 
requestInitialized(ServletRequestEvent)
      请求对象被撤消时,激发  requestDestroyed(ServletRequestEvent)
  
      在request(HttpServletRequest)对象建立或被消灭时,会分别调用requestInitialized()和requestDestroyed()方法。
  
      (2)
ServletRequestAttributeListener接口:监听请求中(request对象中)的属性变化。接口中定义的回调方法有:
  
      向某个request对象中增加属性时被调用attributeAdded(ServletRequestAttributeEvent)方法。
      从某个request对象中删除属性时被调用attributeRemoved(ServletRequestAttributeEvent)方法。
      修改某个request中的属性时被调用attributeReplaced(ServletRequestAttributeEvent)方法。
  
      使用ServletRequestEvent类的getServletRequest()方法可以得到这个被监听的请求对象,使用  ServletRequestAttributeEvent类的getName()方法可以得到属性名,getValue()方法可以得到属性的值。
  
      若有属性加入到某个request对象中时则会调用attributeAdded(),同理在替换属性与删除属性时,会分别调用attributeReplaced()、 attributeRemoved()。 
  
      当Web应用程序启动后,在处理任何请求之前,调用contextInitialzed()方法和getInitParamter()方法,返回  在配置文件中为定义的环境初始化信息。不同的组件,如Servlet、JSP、监听器和过滤器等,通过ServletRequest、 HttpSession 和 ServletContext达到数据共享,这些类都提供了下面的一组方法,可以使用这组方法来设置、获取、删除属性:
  
          public void  setAttribute("属性名",属性值);
          public Object  getAttribute("属性名");
          public void  removeAttribute("属性名");
       
  5.3 监听器管理共享数据库连接
      在web.xml中,使用<listener>来配置监听器,语法是:
  
          <listener>
              <listener-class>包名.类名</listener-class>
          </listener>


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值