文档章节

浅谈 Struts2 拦截器

期待变强的菜鸟
 期待变强的菜鸟
发布于 2014/08/29 10:59
字数 1294
阅读 112
收藏 10

      Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后处理一些逻辑。拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml 没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上(default Stack  默认拦截器栈中params拦截器)。

 

Struts2中自定义拦截器的步骤是:

1.定义拦截器类

2.为Action配置自定义的拦截器类


以定义一个检查是否有请求HelloWorldAction的权限为例:

定义拦截器类

Java代码  收藏代码

  1. package com.tom.interceptors;  


  2. import com.opensymphony.xwork2.ActionInvocation;  

  3. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  

  4. import org.apache.struts2.ServletActionContext;  

  5.   

  6. //继承AbstractInterceptor  

  7. public class PermissionCheckInterceptor extends AbstractInterceptor {  


  8.     @Override  

  9.     public String intercept(ActionInvocation invocation) throws Exception {  

  10.    

  11.        //取permit请求参数,true表示有权限,其它表示没有权限  

  12.         String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];  

  13.   

  14.         Boolean permit = Boolean.valueOf(value);  

  15.         if (Boolean.TRUE.equals(permit)) {  

  16.             return invocation.invoke(); //调用Action的方法,并返回那个方法对应的结果视图  

  17.         }  

  18.         //在checkResult视图上显示message信息  

  19.         ServletActionContext.getRequest().setAttribute("message""Permission denies");  

  20.         return "checkResult"//结果转到checkResult对应的视图  

  21.     }  

  22.   

  23. }  

 

 

定义HelloWorldAction

 

 

Java代码  收藏代码

  1. package com.tom.actions;  

  2.   

  3. public class HelloWorldAction {  

  4.     private String permit; //页面上输出permit的值  

  5.     private String message;  

  6.   

  7.     public String getMessage() {  

  8.         return message;  

  9.     }  

  10.   

  11.     public void setMessage(String message) {  

  12.         this.message = message;  

  13.     }  

  14.   

  15.     public String execute() {  

  16.         this.message = "Permission OK, the permit  value is: " + permit;  

  17.         return "checkResult";  

  18.     }  

  19.   

  20.     public String getPermit() {  

  21.         return permit;  

  22.     }  

  23.   

  24.     public void setPermit(String permit) {  

  25.         this.permit = permit;  

  26.     }  

  27. }  

 

 

配置struts.xml

 

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--引用权限检查拦截器,可以定义多个-->  

  12.             <interceptor-ref name="permissionCheckInterceptor"/>  

  13.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  14.         </action>  

  15.     </package>  

  16. </struts>  

 

 

定义checkResult.jsp

Html代码  收藏代码

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  

  2. <html>  

  3. <head>  

  4.     <title></title>  

  5. </head>  

  6. <body>  

  7.     Check Result: ${message}  

  8. </body>  

  9. </html>  

 

访问:

1. http://localhost:8080/hellons/hi?permit=false

页面显示:Check Result: Permission denies

 

2. http://localhost:8080/hellons/hi?permit=true

页面显示:Check Result: Permission OK, the permit value isnull

 

问题:

 在访问http://localhost:8080/hellons/hi?permit=true时,结果显示permit的值为null,而根据Struts2的请求参数与Action字段的对应关系,value的值应该为true才对。这里为null表示Struts2并没有完成请求参数与action字段的自动绑定,原因是,当我们配置HelloWorldAction的拦截器时,把Struts2默认配置到Action中的拦截器覆盖了,这其中就包括参数绑定拦截器

 

 问题解决

Struts2在配置拦截器时,采用的是一种递归的数据结构,拦截器栈interceptor-stack可以包含一组interceptor-ref也可以包含interceptor-stack。

Struts2为每个Action默认配置的一组拦截器放置于名称为defaultStack的拦截器栈中。所以,当为Action配置拦截器时,需要把默认拦截器配置上,并且默认拦截器应该在最前,因为默认拦截器包含了Struts基础和核心功能,应该让这些拦截器优先执行。

 

修改后的struts2.xml

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--配置默认拦截器-->  

  12.             <interceptor-ref name="defaultStack"/>  

  13.             <!--引用权限检查拦截器,可以定义多个-->  

  14.             <interceptor-ref name="permissionCheckInterceptor"/>  

  15.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  16.         </action>  

  17.     </package>  

  18. </struts>  

 此时访问http://localhost:8080/hellons/hi?permit=true,页面显示Check Result: Permission OK, the permit value is: true

 

 拦截器的其它配置方式

 1.定义并引用拦截器栈

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <!--自定义拦截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.               

  11.             <!--拦截器栈-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->  

  14.                 <!--默认拦截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定义拦截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  22.             <!--拦截器栈包含默认拦截器和自定义拦截器-->  

  23.             <interceptor-ref name="permissionCheckInterceptorStack"/>  

  24.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  25.         </action>  

  26.     </package>  

  27. </struts>  

 

 2.定义默认拦截器

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <!--自定义拦截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.   

  11.             <!--拦截器栈-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->  

  14.                 <!--默认拦截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定义拦截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <default-interceptor-ref name="permissionCheckInterceptorStack"/>  

  22.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  23.             <!--不配置拦截器,则如果包内有default-interceptor-ref定义的拦截器,则使用之。default-interceptor-ref定义的拦截器必须包含defaultStack拦截器栈-->  

  24.             <!--如果配置了拦截器,则default-interceptor-ref定义的拦截器不生效,defaultStack定义的拦截器也不生效-->  

  25.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  26.         </action>  

  27.     </package>  

  28. </struts>  




© 著作权归作者所有

期待变强的菜鸟
粉丝 18
博文 57
码字总数 75590
作品 0
郑州
程序员
私信 提问
struts2基于动态代理的Interceptor

struts2核心功能都是基于struts2拦截器的,而拦截器又是基于java的动态代理。 要实现struts2拦截器,需在struts.xml中配置拦截器,每个action可以指定拦截器,指定了拦截器之后默认的拦截器链...

cjun1990
2015/10/23
1K
0
拦截器

一 概述 1 Struts2是框架,封装了很多功能,Struts2里面封装的功能都是在拦截器里面 2 Struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认拦截器 3 Struts...

Bbigbug
2017/10/20
0
0
.Java程序员从笨鸟到菜鸟之(四十七)细谈struts2(九)内置拦截器和自定义拦截器详解(附源码)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 在上一篇博客中,我们一起看了拦截器的具体实现原理,并且看了一下源码(细谈struts2(八)拦截器的实现原理...

长平狐
2012/11/12
74
0
配置struts2默认的拦截器

首先struts2拦截器的类,要继承AbstractInterceptor类。 package com.huaat.weibo.interceptor; import org.apache.log4j.Logger; import com.huaat.common.utils.web.Struts2Utils;import c......

岳静
2012/07/17
0
0
struts2整合CKEditor和CKFinder实现上传

上一篇文章给大家分享了CKEditor+CKFinder+JSP实现了在线编辑器上传图片的功能,这里在给大家分享一下如何在前面的基础上在struts2下实现这样的功能。 实现与Struts2的整合,整合的过程确实e...

teacheryang
2016/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
5
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
7
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部