struts2拦截器的实现
拦截器顾名思义,就是当有请求访问action时候,拦截器拦截下请求进行某些操作(但是呢,当请求到来时,请求会先到达action类的构造方法,再到达拦截器)。这是请求访问action的时序图:
在struts2当中自带这很多很强大的拦截器,那么是不是我们自己实现一个自定义的struts2的拦截器是不是也就很困难了?答案是否定的。相反,实现struts2的自定义拦截器是相当的容易的。
实现接口方式实现一个自定义的struts2拦截器:
所需实现接口:com.opensymphony.xwork2.interceptor.Interceptor
实现了该接口,也必须实现接口下的三个方法:
init():这是拦截器的初始化方法,在服务器启动只是就会触发该方法,也可以在这方法进行一些初始化的操作,比如对一个字段进行赋值等等。但是呢,在对一个属性进行赋值时候,必须给该属性实现get/set方法。否则是不可以实现对该实行赋值的,怎么赋值呢?一般可以在struts.xml中定义拦截器时候进行赋值,待会再进一步的描述如何进行赋值。
intercept():这个方法是拦截器的核心方法,主要是实现拦截器的逻辑处理等等操作。在请求访问action时候,就会进入到该方法。在这方法中要调用arg0.invoke()。在请求访问action时候,会先进入到该方法,执行arg0.invoke()前代码逻辑语句,执行到arg0.invoke()时,方法action类的相关操作,之后调用action的会调execute。在执行完action的相关操作,在执行到arg0.invoke()后面的逻辑代码,按照堆栈的方法逐个的访问拦截器退出。
destroy():这是struts2拦截器的销毁操作,在拦截器被销毁时候就会执行到该方法。
如何配置struts2拦截器呢?
在struts.xml当中,在package内的顶部配置拦截器。
<interceptors></interceptors>声明拦截器
<interceptor></interceptor>配置拦截器
<param></param>给该拦截器内的属性初始化,如不用初始化拦截器内的属性,则不需添加该标签,name值要与拦截器的属性一致。
<interceptor-ref></interceptor-ref>在action标签内引用已配置的拦截器。
但是细心的伙伴也会发现,在<interceptor-ref></interceptor-ref>标签内也有<param></param>标签,但是呢,改标签也是与配置拦截器时候的而是用方法一致的。但是值得我们注意的是,在相同的拦截器进行相同的属性进行初始化成为不同的值,先后顺序是:配置--->引用。引用时候赋值会覆盖了配置时候赋的值。现在又有一个问题来了,拦截器init方法到底如何被调用呢,也就是说,到底是在声明配置拦截器时候调用还是在引用拦截器时候被调用?根据对拦截器属性的初始化以及init方法打印语句来看:当action标签中出现了引用拦截器时,会在引用之后调用该拦截器。
在添加拦截器时候,千万别忘了添加struts2默认的拦截器<interceptor-ref name="defaultStack"></interceptor-ref>,系统默认的对不添加拦截器的action添加上了改拦截器,但是我们主动的添加拦截器之后,会覆盖掉该方法。不添加很容易会出现意想不到的等情况。
配置示例代码:
<package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="firstInterceptor" class="com.usc.geowind.lilin.interceptors.FirstInterceptor"> <param name="name">gaosi</param> </interceptor> </interceptors> <!--method属性指定是action触发的方法 --> <action name="firstAction" class="com.usc.geowind.lilin.actions.FirstAction" method="execute"> <interceptor-ref name="firstInterceptor"> <param name="name"> lilin</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 结果指向 --> <!-- name属性是指定接收的action返回来的字符串数值 --> <result name="success"> /success.jsp </result> <result name="fail"> /fail.jsp </result> </action> </package>
这样自定义拦截器就基本配置完成了。
当我们要在几个action当中,引用相同拦截器,会不会上面介绍的方法会出现代码冗余的状况?答案是肯定的。这时候就有一个新的概念:拦截器栈队。拦截器栈队:将若干个相同的拦截器打包成为一个拦截器组,在action中引用该拦截器组就可以了。
<package name="default" namespace="/" extends="struts-default"> <interceptors> <!-- 配置拦截器 --> <interceptor name="firstInterceptor" class="com.usc.geowind.lilin.interceptors.FirstInterceptor"> <param name="name">gaosi</param> </interceptor> <!-- 拦截器栈队 --> <interceptor-stack name="allInterceptor"> <interceptor-ref name="firstInterceptor"> <param name="name"> lilin</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!--method属性指定是action触发的方法 --> <action name="firstAction" class="com.usc.geowind.lilin.actions.FirstAction" method="execute"> <!-- 引用拦截器栈队 --> <interceptor-ref name="allInterceptor"></interceptor-ref> <!-- 结果指向 --> <!-- name属性是指定接收的action返回来的字符串数值 --> <result name="success"> /success.jsp </result> <result name="fail"> /fail.jsp </result> </action> </package>
<interceptor-stack></interceptor-stack>就是拦截器栈队。将所需的拦截器加到栈队中就可。
配置默认的拦截器
<default-interceptor-ref></default-interceptor-ref>在改标签中可以配置struts拦截器,在action中不引用拦截器的情况下,struts会默认的引用该默认拦截器
方法拦截器:
在类中需要继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类并重写方法doIntercept()
在配置当中有那么一点不同。
对add,delete方法进行拦截
<interceptor name="MethodInterceptor" class="com.usc.geowind.lilin.interceptors.SecINterceptor"> <param name="includeMethods">add,delete</param> </interceptor>
也可以对某方法进行不拦截:如,对delete ,add方法进行不拦截
<interceptor name="MethodInterceptor" class="com.usc.geowind.lilin.interceptors.SecINterceptor"> <param name="excludeMethods">add,delete</param> </interceptor>
拦截器的基本内容就这些了,但是拦截器还是有很大的作用的,有待继续深入了解。
相关推荐
基于SSH2框架Struts2拦截器的登录验证实现
完整可运行起来的SSH项目!中使用了SAIF 插件 实现拦截器的效果!并且有sql语句 !我使用的是mysql数据库,如果你使用别的数据库请改配置文件!运行成功后注意控制台的输出
strut2 配置自定义拦截器 包括struts2.xml 和 action对应的xml 以及拦截器 可能有点简单 但是基本配置都有
2012最新ssh2框架-struts2.3+hibernate4.1+spring3.1登录+注册(md5加密)带拦截器,mysql数据库,带分页功能, 只需修改com/resource/resourses.properties数据库连接即可使用
struts2验证+拦截器+国际化+下载excle文档+struts2二级联动+ongl表达试+ssh集成\部分代码, 项目下载、 部分代码 请看: http://blog.csdn.net/liangrui1988/article/details/9778787
学习常用知识(java,sql,oracle,ejb,ssh,struts,xml,监听器,拦截器,过滤器等等)这些都是本人的学习心得非常适用,希望能该初学者带来更大的帮助!!!
这个压缩包里有简单的Struts2拦截器的登录应用,里面有实验报告还有项目源代码。这适合初学ssh
struts2验证+拦截器+国际化+下载excle文档+struts2二级联动+ongl表达试+ssh集成.rar
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,...
花了一周弄的SSH增删改查+分页+拦截非法登录+注册登录验证 自己手工写的,边学边查资料完成。包需要自己导,S1.3S2.5H3.1的包。
ssh系统,做一个复杂的统计功能,需要数秒后才能显示页面数据,为了避免给用户展示一个空白的加载页面,做一个等待加载页面是有必要的。
实现了简单用户权限登录,项目中含有mysql数据库 加入了基本的拦截器,错误类处理等 . 里面包含包,直接可以使用。
1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...
很适合初学者学习! 自定义默认栈 Struts2的跳转Result的类型 在Interceptor中注入Spring管理的对象
该文档是SSH框架为基础实现的BBS论坛。其中有整合好的全面的SSH jar包,BBS前台,后台源码,这个小系统的报告,数据库关系分析等。 以下内容摘自报告目录部分(希望...4.14 根据权限定义拦截器 4.15 测试系统相应的功能
结合struts2编写的通用过滤器filter,内附有word文档操作详解,配置十分方便,曾经做ssh项目的时候用于拦截浏览器地址栏非法登录,用在非法登录拦截这一块非常适合,经过测试没有问题。
spring 3.2.0+hibernate 4.1.6+struts2整合需要的jar包 的目录 ...文件上传,拦截器,操作的数据库是Mysql, 如果操作的数据库是oracle或者是其他, 将mysql-connector-java-5.1.20-bin.jar 改为相应的驱动包即可。
使用struts2+spring+hiernate开发的小项目,供想自己搭建环境的兄弟们借鉴,使用了拦截器、过滤器做权限验证和字符集设置。以及spring配置hibernate数据源。数据库方面大家根据hibernate文件和数据源配置自己建立。 ...
在众多情况下,日志的管理是通过拦截器来完成的,不过通过STRUTS2的拦截器编码比较繁琐,在此通过spring的aop来处理,在贫血模式下将代码量降到最低,同时配置文件均可共用,从此,不用为日志管理浪费任何时间。
也就是说Struts2的默认拦截器无法起作用, 这样的话不经过Struts2,这就意味着当项目有需要登录的功能时, 在未登录的情况下,这个端口依旧可以访问,这就带来了很大的安全隐患 要想起作用,请访问...