struts2中拦截器的使用(一)
来源:互联网 发布:完美主义 知乎 编辑:程序博客网 时间:2024/05/01 21:04
一、概述strust2中的拦截器
拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作。Struts2设计的灵巧性,拦截器起了关键性的作用,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可;如果不需要该功能时,也只需要取消该拦截器的配置即可。
Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default. xml文件中,其中name是拦截器的名字,就是以后我们使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的默认struts-default包,则可以自由使用它下面定义的拦截器,否则必须自己定义这些拦截器。struts2中默认的拦截器是defaultStack.
二、自定义拦截器
自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器,自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。
方式一,实现Interceptor接口:
准备工作,使用LoginAction构建一个登录环境,当用户登录成功后,将用户信息保存在session中,LoginAction中的关键代码如下所示:
- public String execute() throws Exception {
- if (userName.equals("struts2")) {
- ActionContext.getContext().getSession().put("user", userName);
- return "loginSuccess";
- } else {
- return "loginFailure";
- }
- }
public String execute() throws Exception {if (userName.equals("struts2")) {ActionContext.getContext().getSession().put("user", userName);return "loginSuccess";} else {return "loginFailure";}}
现在来测试TestAction中的execute()方法,访问的用户是否有权限访问。
TestAction的代码如下所示:
- public class TestAction {
- private String message;
- //setter和getter方法
- public String execute() throws Exception {
- this.message = "test action execute方法已执行";
- return "success";
- }
- }
public class TestAction {private String message; //setter和getter方法public String execute() throws Exception {this.message = "test action execute方法已执行";return "success";}}
拦截器代码如下所示:
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.Interceptor;
- public class PermissionInterceptor implements Interceptor {
- private static final long serialVersionUID = -68905663987676273L;
- @Override
- public void destroy() {
- System.out.println("拦截器成功销毁!");
- }
- @Override
- public void init() {
- System.out.println("拦截器初始化成功!");
- }
- @Override
- public String intercept(ActionInvocation paramActionInvocation)
- throws Exception {
- System.out.println("开始拦截");
- Object user = ActionContext.getContext().getSession().get("user");
- if (user != null) {
- String result = paramActionInvocation.invoke(); // 如果user不为null,代表用户已经登录,则允许执行action中的方法。
- System.out.println("结束拦截");
- return result;
- }
- ActionContext.getContext().put("message", "您没有权限执行该操作!");
- System.out.println("结束拦截");
- return "success";
- }
- }
import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class PermissionInterceptor implements Interceptor {private static final long serialVersionUID = -68905663987676273L;@Overridepublic void destroy() {System.out.println("拦截器成功销毁!");}@Overridepublic void init() {System.out.println("拦截器初始化成功!");}@Overridepublic String intercept(ActionInvocation paramActionInvocation)throws Exception {System.out.println("开始拦截");Object user = ActionContext.getContext().getSession().get("user");if (user != null) {String result = paramActionInvocation.invoke(); // 如果user不为null,代表用户已经登录,则允许执行action中的方法。System.out.println("结束拦截");return result;}ActionContext.getContext().put("message", "您没有权限执行该操作!");System.out.println("结束拦截");return "success";}}
result.jsp页面的代码如下所示:
- <body>
- ${message }
- </body>
<body>${message } </body>
1。为了使用此拦截器,我们必须将此拦截器进行注册,随后再在要使用此拦截器的Action中引用。即首先在<package>中注册,内容如下:
- <interceptors>
- <interceptor name="permission" class="demo.action.PermissionInterceptor" />
- </interceptors>
<interceptors> <interceptor name="permission" class="demo.action.PermissionInterceptor" /></interceptors>
注册完成后,如果我们要在TestAction中使用此拦截器,只需要在<action>中增加如下内容:
- <interceptor-ref name="permission"></interceptor-ref>
<interceptor-ref name="permission"></interceptor-ref>
但这种简单的配置会导致你自己的拦截器覆盖掉struts2默认的拦截器,也就是struts2默认的众多拦截器都将不再生效。
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
最终struts.xml的配置文件如下所示:
- <struts>
- <constant name="struts.multipart.maxSize" value="10701096" />
- <package name="myDemo" namespace="/demo" extends="struts-default">
- <interceptors>
- <interceptor name="permission" class="demo.action.PermissionInterceptor" />
- <interceptor-stack name="permissionStack">
- <interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->
- <interceptor-ref name="permission" />
- </interceptor-stack>
- </interceptors>
- <action name="login" class="demo.login.action.LoginAction">
- <result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>
- <result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>
- </action>
- <action name="test" class="demo.action.TestAction">
- <result>/WEB-INF/jsp/result.jsp</result>
- <interceptor-ref name="permissionStack" />
- </action>
- </package>
- </struts>
<struts><constant name="struts.multipart.maxSize" value="10701096" /><package name="myDemo" namespace="/demo" extends="struts-default"><interceptors><interceptor name="permission" class="demo.action.PermissionInterceptor" /><interceptor-stack name="permissionStack"><interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 --><interceptor-ref name="permission" /></interceptor-stack></interceptors><action name="login" class="demo.login.action.LoginAction"><result name="loginSuccess">/WEB-INF/jsp/success.jsp</result><result name="loginFailure">/WEB-INF/jsp/failure.jsp</result></action><action name="test" class="demo.action.TestAction"><result>/WEB-INF/jsp/result.jsp</result><interceptor-ref name="permissionStack" /></action></package></struts>
在启动整个应用程序时,控制台会打印出“拦截器初始化成功!”信息。
如果在未访问login.action之前访问test.action,则在resul.jsp页面中会显示"您没有权限执行该操作!"信息,同时控制台打印出了信息:
开始拦截
结束拦截
如果在访问login.action之后访问test.action,则在resul.jsp页面中会显示"test action execute方法已执行 !"信息,同时控制台打印出了信息:
开始拦截
结束拦截
实例流程分析:当我们为TestAction配置了拦截器时,并且有客户端请求此Action时,会首先被此拦截器拦住,然后执行System.out.println("开始拦截"),随后我们调用paramActionInvocation.invoke()方法,它会把请求继续传递给下一个拦截器,下一个拦截器也会继续执行相应代码后再调用invoke方法继续传递,直到请求到达最后一个拦截器,它会把请求传递给Action,比如,我们这里只用到了一个拦截器,当它执行完成后,会把请求直接转交到TestAction处理,TestAction处理完成后,它会返回结果给PermissionInterceptor拦截器。
2。如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。
如果配置成如下所示,则当你在登录页面点击提交按钮时,在进入login.action时也会执行拦截,控制台会打印出:
开始拦截
结束拦截
但同时会抛出异常信息,你永远也无法登录系统了。
- <struts>
- <constant name="struts.multipart.maxSize" value="10701096" />
- <package name="myDemo" namespace="/demo" extends="struts-default">
- <interceptors>
- <interceptor name="permission" class="demo.action.PermissionInterceptor" />
- <interceptor-stack name="permissionStack">
- <interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->
- <interceptor-ref name="permission" />
- </interceptor-stack>
- </interceptors>
- <default-interceptor-ref name="permissionStack"/>
- <action name="login" class="demo.login.action.LoginAction">
- <result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>
- <result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>
- </action>
- <action name="test" class="demo.action.TestAction">
- <result>/WEB-INF/jsp/result.jsp</result>
- </action>
- </package>
- </struts>
- struts2中拦截器的使用(一)
- Struts2中Interceptor拦截器的使用
- Struts2中execAndWait拦截器的使用
- struts2中拦截器的使用
- struts2中拦截器使用
- struts2-拦截器(一)
- Struts2 拦截器(一)
- struts2拦截器的使用(二)
- Struts2拦截器的使用
- Struts2拦截器的使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2的拦截器使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- 读《模板的声明和实现为何要放在头文件中?》有感
- c# 字符、汉字等转换
- 《C语言深度剖析》学习笔记1
- ServiceManager & SystemService
- 批处理从FTP下载 最新文件
- struts2中拦截器的使用(一)
- loadrunner 常见 error
- 82天
- IOS开发问题解决之限制UITextField输入特定位数小数时,Done按钮失效
- 神九要升天了!!
- 多网卡FTP测试,绑定本地IP地址
- try-catch-finally-return执行路径总结
- PHP 5.3.1 安装包 VC9 VC6 区别是什么?
- struts2拦截器的使用(二)