- 浏览: 62979 次
- 性别:
- 来自: 北京
最新评论
一、什么是拦截器?
提到拦截器,说得好听点,就是安全性检查,说得不好听,就是强盗。拦截器在程序应用中就是那个扮演强盗半路打劫的角色。 在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们要着个修改它们!!我估计没有人会这么做,它严重违反了软件开发中一条非常重要的可重用代码的规则,同时也是程序员非常讨厌的一件事,老是写重复代码会让一个程序员感到厌烦。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实现的
二、拦截器在Struts2中的应用
对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了
那么怎么在struts2中定义自己的拦截器呢?
很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:
publicinterface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
1) init():在拦截器执行之前调用,主要用于初始化系统资源。
2) destroty():与init()对应,用于拦截器执行之后销毁资源。
3) intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。
通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。
下面创建一个判断用户是否登录的拦截器。代码如下:
struts.xml中配置一下。
**
*
* @author <a href="mailto:flustar2008@163.com">flustar</a>
* @version 1.0
* Creation date: Feb 12, 2008 5:05:28 PM
*/
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class CheckLoginInterceptor extends AbstractInterceptor {
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("begin check login interceptor!");
// 检查Session中是否存在user
Map session = actionInvocation.getInvocationContext().getSession();
String username = (String) session.get("user");
if (username != null && username.length() > 0) {
// 存在的情况下进行后续操作。
System.out.println("already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return Action.LOGIN;
}
}
}
创建好拦截器后,还不能使用,还需要我们在
下面看一下怎么配置拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
</interceptors>
这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
</action>
一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
<interceptor-ref name="defaultStack" />
</action>
但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
<!—-定义一个拦截器栈-->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="checkLogin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。
<interceptor-ref name=" ">
<param name="exculdeMethods"></param>
<param name="includeMethods"></param>
</interceptor-ref>
exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。
includeMethods:需要被拦截的方法,如果有多个以逗号分隔。
PS:该文章参考了别人的一篇文章,例子我也懒得改动了。不过挺好的。如果要掌握好struts2的拦截器原理还需要认真学习下java的动态代理,同时给个建议:在性能要求较高的项目里面,使用动态代理会降低系统的性能
提到拦截器,说得好听点,就是安全性检查,说得不好听,就是强盗。拦截器在程序应用中就是那个扮演强盗半路打劫的角色。 在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们要着个修改它们!!我估计没有人会这么做,它严重违反了软件开发中一条非常重要的可重用代码的规则,同时也是程序员非常讨厌的一件事,老是写重复代码会让一个程序员感到厌烦。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实现的
二、拦截器在Struts2中的应用
对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了
那么怎么在struts2中定义自己的拦截器呢?
很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:
publicinterface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
1) init():在拦截器执行之前调用,主要用于初始化系统资源。
2) destroty():与init()对应,用于拦截器执行之后销毁资源。
3) intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。
通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。
下面创建一个判断用户是否登录的拦截器。代码如下:
struts.xml中配置一下。
**
*
* @author <a href="mailto:flustar2008@163.com">flustar</a>
* @version 1.0
* Creation date: Feb 12, 2008 5:05:28 PM
*/
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class CheckLoginInterceptor extends AbstractInterceptor {
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("begin check login interceptor!");
// 检查Session中是否存在user
Map session = actionInvocation.getInvocationContext().getSession();
String username = (String) session.get("user");
if (username != null && username.length() > 0) {
// 存在的情况下进行后续操作。
System.out.println("already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return Action.LOGIN;
}
}
}
创建好拦截器后,还不能使用,还需要我们在
下面看一下怎么配置拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
</interceptors>
这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
</action>
一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
<interceptor-ref name="defaultStack" />
</action>
但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
<!—-定义一个拦截器栈-->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="checkLogin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。
<interceptor-ref name=" ">
<param name="exculdeMethods"></param>
<param name="includeMethods"></param>
</interceptor-ref>
exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。
includeMethods:需要被拦截的方法,如果有多个以逗号分隔。
PS:该文章参考了别人的一篇文章,例子我也懒得改动了。不过挺好的。如果要掌握好struts2的拦截器原理还需要认真学习下java的动态代理,同时给个建议:在性能要求较高的项目里面,使用动态代理会降低系统的性能
发表评论
-
mysql 索引知识积累
2013-01-05 15:45 8731.MySQL能够在name的索引中查找“Mike”值,然后直 ... -
Struts2中的ModelDriven机制及其运用(转)
2012-12-31 17:34 756为什么需要ModelDriven 所谓ModelDriv ... -
WEB struts2 实现定时执行
2012-09-20 14:59 1122Spring中Quartz的配置 各种企业应用几乎都会碰到任务 ... -
myeclipse自动生成hibernate的Mapping和po文件
2012-09-06 15:17 769用过hibernate的人都知道,hibernate po的M ... -
struts2中减少action数量(通配符使用)
2012-08-22 17:02 800如struts中配有如下几个action,ManagerUse ... -
mysql命令
2012-06-29 09:35 8061.Mysql远程导出命令: mysqldump -h192. ... -
Hibernate 的原理与配置
2012-05-30 16:05 772也许你听说过Hibernate的大名,但可能一直不了解它,也许 ... -
华为的JAVA面试题及答案(部分)-收藏
2012-05-04 08:56 0华为的JAVA面试题 (后记:没有想到华为的面试题就是非同一般 ... -
JAVA中堆栈和内存分配原理(转)
2012-03-11 10:33 7601、栈、堆 1.寄存器:最快的存储区, 由编译器根据需求进行 ... -
java基础梳理
2012-03-11 09:22 9021.java中成员变量和局部变量的区别:成员变量如果程序员 ... -
用spring的beans配置mysql数据库
2012-03-06 15:07 7671今天很兴奋,因为我用spring的beans配置mysql ... -
final用法小感
2012-03-02 11:02 794final是java中的关键字,它虽然不常用,但是用处也很大。 ... -
docx4j学习网站
2012-02-16 17:40 1979docx4j学习网址:http://www.docx4java ... -
解决svn 提交时报Cant open file /data/svn/develop/db/txn-current-lock: Permission deni
2011-09-23 16:21 2022今天在测试服务器上安装、配置subversion都非常顺利的, ... -
原来java中还有精度操作问题
2011-05-26 10:15 873看来自己知道的东西 ... -
有关try catch
2011-03-28 09:37 869try{……}里面是一些你觉得可能会出问题的代码,catch里 ...
相关推荐
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...
同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...
Struts2 拦截器的实现原理相对简单,当请求 Struts2 的 action 时,Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。 Struts2 规定用户自定义...
- **拦截器**:Struts2的核心之一,通过拦截器可以实现诸如文件上传、输入验证等功能。 - **处理与分配流程**: - **前端请求**:用户发起的HTTP请求。 - **StrutsPrepareAndExecuteFilter**:处理请求的第一道...
2. **拦截器(Interceptors)**:Struts2的核心特性之一就是拦截器,它们在Action执行前后进行一系列的操作,如日志记录、权限验证等。通过源码,我们可以研究不同拦截器的实现机制及其组合使用方式。 3. **配置文件...
我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。Spring Boot 同样提供了...
拦截器是Struts 2中非常重要的一个概念,主要用于处理横切关注点。例如,日志记录、事务管理等都可以通过定义拦截器来实现。 - **name**:拦截器名称。 - **class**:拦截器对应的实现类。 示例代码如下: ```xml ...
配置`web.xml`文件,设置Struts2的过滤器,以便拦截所有请求: ```xml <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher <filter-name>struts2 <url-pattern>/* ``` ...
Struts2具有强大的拦截器机制,可以方便地添加如日志、权限控制等功能。此外,Struts2的OGNL表达式语言简化了数据绑定和视图渲染。 2. **Hibernate**:是一个对象关系映射(ORM)工具,它允许开发者用Java对象来...
Struts2提供了强大的拦截器机制和丰富的插件,便于开发者实现复杂的业务逻辑和页面控制。 Hibernate框架是一个对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,减少了手动编写SQL语句的工作量...
3) Struts2框架的主要组件,如Action、拦截器、结果视图以及过滤器配置。 4) Hibernate框架的配置,如sessionFactory的配置,以及通过注解或XML文件设置对象关系映射。 5) Spring框架的组件和概念,包括IoC容器、AOP...
* Struts2 使用拦截器来处理请求,而 Struts1 使用 Action。 * Struts2 使用 OGNL 表达式来访问 JavaBean 的属性,而 Struts1 使用 JSTL。 Hibernate 的优点和缺点 Hibernate 是一个 ORM 框架,它提供了很多优点:...
它提供了拦截器(Interceptor)机制,可以方便地添加额外的功能和拦截器链。 2. **Spring**:是应用管理容器,负责管理和协调各种组件,包括事务管理、依赖注入(DI)和面向切面编程(AOP)。Spring还提供了与...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
- **Struts2**: Struts2框架的核心组件是拦截器,它负责处理用户请求,并将其传递给Action处理。Action处理完后,将控制权交给结果(Result),由结果负责展示数据。 **3. 编写一个能够体现单例模式思想的类** ```...