`
jveqi
  • 浏览: 322484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单理解Struts2中拦截器与过滤器的区别及执行顺序

阅读更多

struts2体系结构图:

当接收到一个httprequest , 
a) 当外部的httpservletrequest到来时 
b) 初始到了servlet容器 传递给一个标准的过滤器链 
c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy 
d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml 
       i. 下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前) 
       ii. Interceptor做一些拦截或者初始的工作 
e) 一旦action返回,会查找相应的Result 
f) Result类型可以是 jsp或者freeMark 等 
g) 这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序) 
h) 响应的返回是通过我们在web.xml中配置的过滤器 
i) 如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。 

 

 

 

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

 

 

org.apache.struts2.dispatcher.FilterDispatcher的四个功能

 

org.apache.struts2.dispatcher.FilterDispatcherStruts2的主要的Filter,负责四个方面的功能:
      (1)
执行Actions
        (2)
清除
ActionContext
        (3)
维护静态内容

        (4)
清除request生命周期内的XWorkinterceptors
               
另注:该过滤器应该过滤所有的请求URL。一般被设置为
/*.(过滤所有的请求!)
    
具体:

        (1)
执行Actions
            
过滤器通过ActionMapper对象,来判断是否应该被映射到Action.如果mapper对象指示他应该被映射,过滤链将会被终止,
然后Action被调用。这一点非常重要,如果同时使用SiteMesh filter,则SiteMesh filter应该放到该过滤器前,否则Action的输出将不会被装饰。

        (2)
清除ActionContext
            
过滤器为了确保内存溢出,会自动的清除ActionContext。这可能会存在一些问题,在和其它的框架集成时,例如SiteMeshActionContextCleanUp提供了怎么处理这些问题的一些信息。

        (3)
维护静态内容
            
过滤器也会维护在Struts2中使用的一些公共的静态的内容,例如JavaScript文件,CSS文件等。搜索/struts/*范围内的请求,然后将/struts/后面的值映射到一些struts的公共包中,也可以在你的类路径中搜索。默认情况下会去查找以下包:org.apache.struts2.static.template。这样你只用请求/struts/xhtml/styles.cssXHTML UI主题默认的样式表将会被返回。同样,AJAX UI组件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml设置filter时,通过给"actionPackages"初始参数一个逗号隔开的包列表值来设定。
            
需注意的是:他会暴露一些比较敏感的信息例如,properites文件中的数据库连接信息。
    
注:过滤器支持以下初始参数:
         config - 
被调入的逗号隔开的XML文件列表。
         actionPackages - 
actions扫描的逗号隔开的packages列表。
         configProviders - 
逗号分隔的实现了ConfigurationProvider接口(建造Configuration时被使用)的实现类。
         * 
 任意的struts常量。
    
通过重载createDispatcher()方法,可以自定义dispather
    
    
属性列表:
         (1)actionMapper
:通过注入,提供一个ActionMapper实例。
         (2)dispatcher
:暴露给子类一个Dispatcher实例。
         (3)encoding
:存储StrutsConstants.STRUTS_I18N_ENCODING的设置。
         (4)filterConfig
:通过初始参数,提供一个FilterConfig实例。
         (5)lastModifiedCal
:在缓存静态content,提供一个格化的日期用于设定头信息。
         (6)log
:提供一个logging实例。
         (7)patchPrefixs
:存储静态资源的路径前缀信息。
         (8)serveStatic
:存储StrutsConstants.STRUTS_SERVE_STATIC_CONTENT的设置。
         (9)serveStaticBrowserCache
:存储StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的设置。
    
方法列表:
         (1)copy(InputStream input, OutputStream output)
:从input复制数据到output
         (2)createDispatcher(FilterConfig filterConfig)
:创建默认的dispatcher对象,如果需要的话,子类可以重载此方法,自定义一个dispatcher对象。
         (3)destory()
:调用dispatcher.cleanup(),依次释放本地线程,销毁dispatcher对象。
         (4)doFilter(ServletRequest request, ServeltResponse response, FilterChain chain)
:处理一个action或处理一个请求的静态内容。
         (5)findInputStream(String name, String packagePrefix)
:搜索类路径下的静态资源。
         (6)findStaticResoruce(String name, HttpServletRequest request, HttpServletResponse response)
:搜索静态的资源,直接复制到相应response的头信息中。
         (7)getContentType(String name)
:获取指定资源的contentType
         (8)getFilterConfig()
:获取FilterConfig实例。
         (9)getServletContext()
:给WebLogic的一些版本提供一个工作区。

        (9)init(FilterConfig filterCongfig):创建默认的dispatcher对象和设置静态资源的默认包信息来初始化filter。
         (10)parse(String packages):返回一个数组通过解析一个指定逗号分隔的packages列表。
         (11)prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response):对给定的request对象进行封装返回一个封装HttpServletRequest对象。例如显示的处理multipart数据。
         (12)setMapper(ActionMapper actionMapper)
         (13)setEncoding(String val)
         (14)setServeStaticContent(String val)
         (15)setServeStaticBrowserCache(String val)

 

 

附:

Struts2XWork)提供的拦截器的功能说明:

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result<result type=”chain”>)结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox

Cookies Interceptor

cookies

使用配置的name,value来是指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用ActionsetModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

Action状态存入sessionapplication的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequestHttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

 
分享到:
评论

相关推荐

    Struts2拦截器实现权限控制demo

    这个demo对于初学者来说,是一个很好的起点,可以帮助他们理解如何在实际项目中结合Struts2的拦截器和权限控制来增强应用的安全性。在实际开发中,拦截器还可以用于日志记录、性能监控、事务管理等其他场景,极大地...

    struts2 拦截器

    2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...

    struts03:拦截器、过滤器与拦截器的区别、文件上传

    本文将深入探讨Struts框架中的拦截器(Interceptor)以及它与过滤器(Filter)的区别,并结合文件上传功能进行讲解。 1. 拦截器与过滤器的概念 - **拦截器**:在Struts2框架中,拦截器是基于AOP(面向切面编程)的...

    Struts2 拦截器过滤方法(二十八)

    在"Struts2 拦截器过滤方法(二十八)"这个主题中,我们将深入探讨Struts2拦截器的工作原理、如何创建自定义拦截器以及它们在实际应用中的作用。 首先,拦截器是基于Java的动态代理机制实现的,它们在Action执行...

    Struts2 拦截器

    在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...

    使用struts2拦截器对登陆权限验证

    在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...

    Struts2拦截器的实现原理(csdn)————程序.pdf

    在Struts2中,拦截器工作在Action和结果(Result)之间,形成一个拦截器栈,每个拦截器按照配置的顺序依次执行。 Struts2的拦截器执行流程如下: 1. **初始化拦截器栈**:当Struts2框架启动时,会根据配置文件...

    浅谈Struts2拦截器的原理与实现.docx

    Struts2 拦截器是Struts2框架的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现对请求的预处理和后处理,从而增强应用程序的功能和控制流程。以下是对Struts2拦截器原理与实现的详细解析: ...

    struts2拦截器原理

    Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 ...

    struts2拦截器时序图

    Struts2拦截器是Struts2框架中的一个重要组件,它提供了一种机制允许开发者在Action调用前后插入自定义的行为,甚至能够阻止Action的执行。这种机制在很多企业级Java项目中有着广泛的应用,例如进行数据转换、校验、...

    Struts2 配置登陆拦截器

    在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对Action调用进行拦截,执行特定的任务。登录拦截器通常用于验证用户是否已登录,如果未登录,将重定向到登录页面。 配置登录拦截器主要...

    12 struts2拦截器

    在Struts2中,创建一个拦截器非常简单,只需要实现`Interceptor`接口或者继承`AbstractInterceptor`抽象类。通常,我们会选择继承`AbstractInterceptor`,因为它提供了一些基本的方法和属性。然后在`intercept()`...

    Struts2自定义拦截器

    拦截器是Struts2的核心特性之一,它们在Action调用之前和之后执行,扮演着类似于过滤器的角色,允许我们实现诸如日志记录、权限检查、事务管理等通用功能。在深入探讨自定义拦截器之前,我们先理解一下Struts2拦截器...

    Java Struts 实现拦截器

    其中,拦截器(Interceptor)是Struts2中的一个关键特性,用于扩展框架的功能,实现诸如事务管理、权限控制、输入验证等功能。 #### Struts2的处理流程 1. **客户端请求**: 当客户端发起HTTP请求时,请求首先到达...

    用struts2拦截器实现输入数据过滤前后空格

    拦截器是Struts2框架中的一个重要概念,它允许开发者在动作执行前后插入自定义逻辑,比如数据验证、日志记录、性能监控等。在这个场景中,我们将探讨如何使用Struts2拦截器来实现输入数据的过滤,特别是去除前后空格...

    struts2拦截器

    - 在 Struts2 中,拦截器的工作方式类似于过滤器(Filter),但更面向业务逻辑。它们按照预定义的顺序组成一个拦截器栈,当请求到达Action时,会逐个执行这些拦截器。 2. **拦截器的配置** - 在 `struts.xml` ...

    struts2中的拦截器

    在Struts2中,拦截器扮演着类似于过滤器的角色,但它们更专注于处理Action执行前后的逻辑。 首先,我们来了解拦截器的工作原理。当一个请求到达Struts2框架时,会通过一系列预先配置的拦截器链进行处理。每个拦截器...

    struts过滤器(拦截器)程序.zip

    在`struts过滤器(拦截器)程序.zip`中,我们可以看到这些概念如何在实际项目中得到运用,包括`web.xml`的配置、`struts.xml`的拦截器定义以及相关的Java源码和JSP页面,它们共同构成了一个完整的Struts2应用实例。

Global site tag (gtag.js) - Google Analytics