`

过滤器与封装器

 
阅读更多

1.过滤器的实现

在servlet/jsp容器中实现过滤器,必须实现Filter接口,并在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。

 

doFilter()中的过程:

service()前置处理

chain.doFilter(request,response);

service后置处理

 

 

如果调用了FilterChain的doFilter(),就会执行下一个过滤器,如果没有下一个过滤器,就调用请求目标Servlet的service().如果没有通过过滤器的验证,则请求不会继续交给下面的过滤器或目标Serlvlet,这时就是所谓的拦截请求。

 

 

Ps:

Servlet/Jsp的过滤器机制,其实就是Java EE设计模式的Interceptor Filter模式的实现。

 

2.过滤器的设置

 

web.xml

<filter>

  <filter-name>Per</filter-name>

  <filter-class>...</filter-class>

  <init-param>

      <param-name></

      <param-value></

  </init-param>

</filer>

<filter-mapping>

  <filter-name>Per</filter-name>

  <url-patter>/prime.do</这里或者是<servlet-name>userServlet</

  <dispatcher>REQUEST</

  <dispatcher>FORWARD</

  <dispatcher>INCLUDE</

  <dispatcher>ERROR</

</filter-mapping>

 

<url-patter>设置哪些URL请求必须应用哪个过滤器

<servlet-name>设置哪些Servlet将应用此过滤器

可以指定<url-patter>或<servlet-name>,且可以出现多次(可以2个都存在)。如果想符合所有的Servlet名称,则可以使用*

<servlet-name>*</servlet-name>

 

3.触发过滤器的时机

 <dispatcher>指定哪些请求转发类型可以触发过滤器

 

 1) 默认是浏览器直接发出请求(<dispatcher>REQUEST</)

 2) 如果是RequestDispatcher 的forward()或include()请求,则可以是

  <dispatcher>FORWARD</

  <dispatcher>INCLUDE</

 

 

 3) <dispatcher>ERROR是容器处理异常而转发过来的请求

 

不设置<dispatcher>即是默认的REQUEST

Ps:

当然这些请求转发的类型也要满足<servlet-name>或<url-pattern>才能执行过滤器

 

4.过滤器执行顺序

如果有某个URL或Servlet会应用多个过滤器,则根据<filter-mapping>在web.xml中出现的先后顺序,来决定过滤器的执行顺序。

 

 

封装器

1.对容器产生的请求与响应对象进行封装,以针对某些请求或响应进行加工处理,因为有些信息无法修改,如请求参数,所以需要封装。

 

虽然可以使用HttpServletRequest的getParameter()取得请求参数值,但就是没有类似setParameter()的方法可以将处理后的参数值重新设置给HttpServletRequest。

 

HttpServletRequestWrapper实现了HttpServletRequest接口,这样不用自己实现此接口,只有继承HttpServletRequestWrapper类,并编写想要重新定义的方法即可。相对于ServletRequest接口,也有个 ServletRequestWrapper类可以使用。

 

同理:(HttpServletResponse ServletResponse同样类比)

 

2.HttpServletRequestWrapper的实现

继承HttpServletRequestWrapper之后,必须定义构造函数,通过super()来调用父类的构造函数,并传入想要封装的原请求对象,之后若想取出原请求对象,可以通过getRequest()来取得。

 

Ps:可以使用封装类和过滤类搭配,也可以在Servlet中进行封装类的实例建立对请求或响应进行封装。

封装之后,在Filter或Servlet中使用此对象,不需要也不用知道请求对象是否被封装,一样调用getParameter()即可。

 

3.HttpServeltResponseWrapper类的实现

例:

如果想要对响应的内容进行压缩处理,就要像办法让HttpServletResponse对象具有压缩处理的功能。

若想要对浏览器进行输出响应,必须通过getWriter()取得PrintWriter,或是getOutputStream()取得ServletOutputStream.所以针对压缩输出的需求。主要在继承HttpServletResponseWrapper之后,通过重写这2个方法达成。

 

 

 

分享到:
评论

相关推荐

    zendframework2过滤器封装

    本文将深入探讨ZF2中的过滤器封装及其使用方法。 首先,我们要理解过滤器在ZF2中的作用。过滤器主要用于数据预处理,它可以清洗、验证或者转换用户输入的数据,确保数据安全且符合业务逻辑。例如,你可以使用过滤器...

    web过滤器 c#

    在C#编程环境下,我们可以使用ASP.NET框架来实现Web过滤器,它对于构建安全、高效且可扩展的Web应用程序至关重要。 在ASP.NET中,过滤器主要分为四种类型:Action Filters、Authorization Filters、Exception ...

    过滤器的使用了javabean

    在Java Web开发中,过滤器(Filter)是一个非常重要的...总的来说,过滤器与JavaBean的结合使用,能够有效地增强Java Web应用的功能性和安全性。理解并熟练掌握这些概念,对于任何Java Web开发者来说都是非常重要的。

    字符编码过滤器

    本篇文章将详细探讨Java过滤器(Filter)的概念,字符编码的重要性,以及如何通过封装工具类来实现统一的字符编码。 首先,让我们理解什么是Java过滤器。在Java Servlet规范中,过滤器(Filter)是一种用于拦截HTTP...

    设计模式-过滤器模式

    过滤器模式,又称为Criteria模式或Specification模式,是一种在软件设计中常见的行为设计模式,它主要用来封装一系列的条件判断,使复杂的查询过程简化。在iOS开发中,过滤器模式可以用于处理数据筛选,比如在App中...

    jsp+servlet登录验证过滤器

    10. **最佳实践**:为了保持代码的可维护性和可扩展性,建议将登录验证逻辑封装在一个独立的服务类中,而不是直接写在过滤器里,这样可以方便地对验证逻辑进行修改和测试。 综上所述,"jsp+servlet登录验证过滤器...

    基于vb6开发的网站过滤器源代码

    【VB6网站过滤器源代码解析】 VB6(Visual Basic 6)是微软推出的一款可视化编程工具,它以其直观易用、开发效率高的特点深受程序员喜爱。本篇将围绕“基于VB6开发的网站过滤器源代码”这一主题,深入探讨相关知识...

    过滤器存储过程用例

    过滤器存储过程是一种在数据库管理系统中用于处理数据的高级技术,尤其在大数据量和复杂查询场景下显得尤为重要。标题“过滤器存储过程用例”提示我们,这里将探讨的是如何在实际应用中使用这种技术。 过滤器存储...

    Servlet过滤器机制分析及应用

    ### Servlet过滤器机制分析及应用 #### 一、概述 Servlet过滤器是Java Web应用程序中的一个重要组成部分,它提供了一种灵活的方式来对客户端的请求和服务器的响应进行预处理和后处理。这种机制允许开发者在不改变...

    Vue封装全局过滤器Filters的步骤

    Vue允许开发者通过全局过滤器的方式统一管理各种数据格式化的逻辑,提高代码的复用性与可维护性。本篇内容将详细介绍在Vue项目中如何封装全局过滤器,以及相关的步骤和注意事项。 ### Vue封装全局过滤器的步骤 ###...

    servlet过滤器Filter入门

    通过本文,我们可以了解到 Servlet 过滤器 Filter 是一个非常强大且标准的机制,能够提供一种模块化的方式来封装公共的行为,并能够对许多不同的资源进行批量性的更改。但是,它也存在一些限制,例如只能在与 ...

    FLV格式封装过滤器源代码

    一个flv格式的directshow封装过滤器器,支持aac,h264视频封装成为flv流或文件的过滤器,用到directshow流媒体开发中。

    简单的JSP登入过滤器类写法

    【JSP 登录过滤器详解】 在Web开发中,为了保护特定资源,通常需要实现登录过滤器,确保只有已登录...此外,为了提高代码可维护性和可扩展性,通常会将过滤器逻辑封装到独立的类中,而不是直接在`Filter`实现中处理。

    PLC海水过滤器反冲洗自动控制系统分析.pdf

    在海水过滤器的反冲洗自动控制系统中,PLC的应用尤为重要,它可以实现海水过滤器的自动启停,有效避免了手动操作的不便和可能带来的误差,提高了海水过滤系统的运行效率和可靠性。 二、海水过滤器反冲洗自动控制...

    【Java设计模式】过滤器模式

    Java中的过滤器设计模式对于创建动态和可扩展的过滤解决方案至关重要。该模式允许将一系列过滤器应用于数据对象,增强了数据处理的灵活性和可扩展性。 ## 二、别名 * 过滤器 * 管道和过滤器 ## 三、过滤器设计模式...

    留言本程序中的过滤器

    在实现这些过滤器时,开发者通常会利用编程语言提供的中间件、装饰器或自定义函数,将过滤逻辑封装起来,便于重用和维护。例如,在Java的Servlet环境中,可以使用Filter接口创建过滤器;在Python的Django或Flask框架...

    在使用实现过滤器进行request包装,获取内层request的分析

    通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`manager`可能是一个管理多个过滤器的类,负责它们的注册、排序和执行。 在过滤器中,有时我们需要访问原始的请求对象,以获取未被过滤的信息。例如,用户...

    参数去空过滤器

    此外,为了提高效率和可维护性,可以考虑将参数去空的功能封装成一个独立的工具类或方法,这样在多个过滤器或业务逻辑中都可以复用。 总结来说,参数去空过滤器是Java Web开发中一个实用的组件,它通过对用户输入...

Global site tag (gtag.js) - Google Analytics