`
winie
  • 浏览: 224400 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Struts2拦截器学习

    博客分类:
  • ss
阅读更多

一、什么是拦截器?

提到拦截器,使我不得不 想起武侠剧中劫匪们常说的一句话:“此山是我开,此树是我栽,要打此路过,留下买路财!”。难不成程序中也有“打劫”的,说的没错,拦截器就是个打劫的。 在现实生活中,劫匪劫的大都是钱财,当然也有别的什么,那么程序中的“劫匪”劫的又是什么呢?或者说程序中为什么需要它?在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们是不是要着个修改它们呢?我估计没有人会这么做,它严重违反了软件开发中一条非常重要的 DRY规则,不写重复代码。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用 Java中的动态代理来实现的,具体可以参考 设计模式学习笔记 ( 十六 )—Proxy 模式 》。

二、拦截器在 Struts2中的应用

对于 Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像 params拦截器将 http请求中参数解析出来赋值给 Action中对应的属性。 Servlet-config拦截器负责把请求中 HttpServletRequest实例和 HttpServletResponse实例传递给 Action……struts2内置的拦截器有 很多,在此我就不一一列举了,具体可以参考《Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解 》。

那么怎么在 struts2中定义自己的拦截器呢 ?

很简单 Struts2为我们提供了一个 Interceptor接口 ,该接口源代码如下 :

public interface 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:需要被拦截的方法,如果有多个以逗号分隔。

一、什么是拦截器?

提到拦截器,使我不得不想起武侠剧中劫匪们常说的一句话:“此山是我开,此树是我栽,要打此路过,留下买路财!”。难不成程序中也有“打劫”的,说的没错,拦截器就是个打劫的。在现实生活中,劫匪劫的大都是钱财,当然也有别的什么,那么程序中的“劫匪”劫的又是什么呢?或者说程序中为什么需要它?在我们的日常编程中少不了写一些重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些地方还需要完善,我们是不是要着个修改它们呢?我估计没有人会这么做,它严重违反了软件开发中一条非常重要的DRY规则,不写重复代码。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实现的,具体可以参考《设计模式学习笔记(十六)—Proxy模式》。

二、拦截器在Struts2中的应用

对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了,具体可以参考《Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解》。

那么怎么在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:需要被拦截的方法,如果有多个以逗号分隔。

 

分享到:
评论

相关推荐

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    struts2拦截器应用小例子

    通过这个例子,你可以学习到如何创建、注册拦截器,以及如何在Struts2框架中构建拦截器栈,从而更灵活地管理应用程序的行为。 总结来说,Struts2的拦截器机制提供了强大的功能,允许开发者以声明式的方式控制请求的...

    Struts2学习案例(拦截器)

    在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...

    struts2拦截器学习小例子--实现权限控制

    (1)首先直接访问 http://localhost:8080/MyStudy/showAction,我们会发现直接访问myhome.jsp会转入登录页面提示...(2)这时候输入xiaoming 12345登录,进入welcom.jsp页面 (3)点击链接后成功进入myhome.jsp页面

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

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

    struts2.X 拦截器源码

    了解了拦截器的基本原理后,我们可以通过`Struts2.x 拦截器.avi`这个视频文件深入学习Struts2拦截器的实现细节,比如如何编写自定义拦截器、如何配置拦截器链、如何处理异常等。`readme.txt`可能是关于这个主题的...

    Struts1 拦截器(SAIF)的使用

    Struts1 框架是Java Web...总的来说,这个项目提供了一个学习和实践Struts1拦截器的实例,尤其是SAIF插件的应用。通过深入理解并动手运行此项目,你可以掌握如何在实际开发中利用拦截器来提高应用的灵活性和可维护性。

    struts拦截器的例子

    这个"struts拦截器的例子"提供了一个学习和理解拦截器工作原理的起点,非常适合对这一主题感兴趣的初学者。 Struts 2框架是MVC(Model-View-Controller)设计模式的一个实现,它允许开发者构建可维护、可扩展的Web...

    struts2拦截器实例

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它极大地简化了Java Web应用程序的开发。在Struts2框架中,拦截器扮演...通过学习和实践,开发者可以更好地理解和掌握Struts2拦截器的用法,提升开发效率和代码质量。

    Struts2 拦截器-v3

    通过深入学习"Struts2 拦截器-v3",开发者不仅可以理解Struts2框架的核心机制,还能掌握如何利用拦截器提升应用的灵活性和可扩展性。实践案例和动手练习将帮助巩固理论知识,提高实际开发技能。

    Struts2拦截器

    关于Struts2拦截器讲解比较详细的PPT,可以下来学习下~

    struts2拦截器示例

    Struts2是一个强大的Java EE应用程序框架,主要用于构建Web应用程序。拦截器是Struts2的核心特性之一,它在...通过学习和实践这个示例,你可以更深入地理解Struts2的拦截器机制,以及如何在实际项目中有效地利用它。

    浪曦struts2拦截器源码

    通过分析浪曦Struts2拦截器源码,我们可以学习如何编写和使用拦截器,理解Struts2的请求处理流程,以及如何通过拦截器优化和增强应用功能。这将有助于提升我们的Struts2开发技能,更好地应对实际项目中的挑战。 在...

    Struts2 拦截器 手动验证 或 自动验证 后台登录验证 源码

    2. 注册拦截器:在Struts2的配置文件(如struts.xml)中,将这个拦截器添加到默认栈或者自定义拦截器栈中。 3. 检查登录状态:在`intercept()`方法中,可以通过Session或者其他方式检查用户是否已登录,未登录则返回...

    struts2拦截器

    struts2拦截器的教程,可以深入学习struts2的原理

    struts2拦截器笔记

    通过深入学习 Struts2 的拦截器机制,开发者可以更好地理解框架的工作原理,并且能够定制化地处理业务需求,提高应用程序的效率和安全性。同时,这也为团队协作和代码规范提供了有力的支持。因此,熟悉并熟练运用...

    简单Struts2拦截器

    总之,简单Struts2拦截器是理解Struts2框架的关键部分,通过学习和实践,开发者能够有效地提升代码质量和项目维护性。对于初学者来说,从基础开始了解并掌握拦截器的用法,将有助于进一步探索Struts2的高级特性和...

    Struts拦截器案例——登陆

    Struts拦截器是Java Web开发中的一个重要概念,尤其在基于Struts2框架的应用中,它扮演着处理请求、验证输入、记录日志等关键角色。在这个"Struts拦截器案例——登陆"中,我们将深入探讨如何利用Struts拦截器实现...

    struts2中拦截器的使用

    Struts2是一个强大的Java Web框架,它通过提供一系列的拦截器(Interceptors)来实现灵活的控制...学习如何创建自定义拦截器,以及如何结合不同的拦截器来实现复杂的业务逻辑,对于提升Struts2框架的使用技能至关重要。

    struts2拦截器控制权限

    Struts2是一个强大的Java EE框架,它用于构建和维护可扩展且易于管理的企业级Web应用程序。在Struts2中,拦截器(Interceptor...通过不断学习和实践,你可以更熟练地运用Struts2拦截器来构建高效、安全的Web应用程序。

Global site tag (gtag.js) - Google Analytics