`
lgl669
  • 浏览: 170315 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts2拦截器(Interceptor)

阅读更多

Struts2拦截器(Interceptor)
                                                               ++YONG原创,转载请注明

1.    理解拦截器
1.1.    什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2.    拦截器的实现原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。如下图:


2.    拦截器的配置
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

Struts2(XWork)提供的拦截器的功能说明:

 

拦截器
 名字
 说明
 
Alias Interceptor
 alias
 在不同请求之间将请求参数在不同名字件转换,请求内容不变
 
Chaining Interceptor
 chain
 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
 
Checkbox Interceptor
 checkbox
 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
 
Cookies Interceptor
 cookies
 使用配置的name,value来是指cookies
 
Conversion Error Interceptor
 conversionError
 将错误从ActionContext中添加到Action的属性字段中。
 
Create Session Interceptor
 createSession
 自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
 
Debugging Interceptor
 debugging
 提供不同的调试用的页面来展现内部的数据状况。
 
Execute and Wait Interceptor
 execAndWait
 在后台执行Action,同时将用户带到一个中间的等待页面。
 
Exception Interceptor
 exception
 将异常定位到一个画面
 
File Upload Interceptor
 fileUpload
 提供文件上传功能
 
I18n Interceptor
 i18n
 记录用户选择的locale
 
Logger Interceptor
 logger
 输出Action的名字
 
Message Store Interceptor
 store
 存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
 
Model Driven Interceptor
 model-driven
 如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
 
Scoped Model Driven
 scoped-model-driven
 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
 
Parameters Interceptor
 params
 将请求中的参数设置到Action中去。
 
Prepare Interceptor
 prepare
 如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
 
Scope Interceptor
 scope
 将Action状态存入session和application的简单方法。
 
Servlet Config Interceptor
 servletConfig
 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
 
Static Parameters Interceptor
 staticParams
 从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。
 
Roles Interceptor
 roles
 确定用户是否具有JAAS指定的Role,否则不予执行。
 
Timer Interceptor
 timer
 输出Action执行的时间
 
Token Interceptor
 token
 通过Token来避免双击
 
Token Session Interceptor
 tokenSession
 和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
 
Validation Interceptor
 validation
 使用action-validation.xml文件中定义的内容校验提交的数据。
 
Workflow Interceptor
 workflow
 调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
 
Parameter Filter Interceptor
 N/A
 从参数列表中删除不必要的参数
 
Profiling Interceptor
 profiling
 通过参数激活profile
 

 

       在struts.xml文件中定义拦截器,拦截器栈:

<package name="my" extends="struts-default" namespace="/manage">

        <interceptors>

        <!-- 定义拦截器 -->

        <interceptor name="拦截器名" class="拦截器实现类"/>

        <!-- 定义拦截器栈 -->

        <interceptor-stack name="拦截器栈名">

             <interceptor-ref name="拦截器一"/>

             <interceptor-ref name="拦截器二"/>

        </interceptor-stack>

        </interceptors>

        ......

</package>
 

3.    使用拦截器
一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。拦截器的拦截行为将会在Action的exceute方法执行之前被执行。

<action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">

            <result name="success">/success.jsp</result>

            <result name="error">/error.jsp</result>

<!-- 使用拦截器,一般配置在result之后, -->

<!-- 引用系统默认的拦截器 -->

<interceptor-ref name="defaultStack"/>

            <interceptor-ref name="拦截器名或拦截器栈名"/>

        </action>
 

       此处需要注意的是,如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。

4.    自定义拦截器
作为“框架(framework)”,可扩展性是不可或缺的。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。

1.    

2.    

3.    

4.    

4.1.    实现拦截器类:
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三个方法:

1)      void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。

2)      void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。

3)      String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。

4.2.    使用自定义拦截器:
两个步骤:

l  通过<interceptor …>元素来定义拦截器。

l  通过<interceptor-ref …>元素来使用拦截器。

5.    自定义拦截器示例

5.1.    问题描述:
使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。

5.2.    实现权限控制拦截器类:
AuthorizationInterceptor.java

package org.qiujy.common;

 

import java.util.Map;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

/**

 * 权限检查拦截器

 *

 * @author qiujy

 * @version 1.0

 */

public class AuthorizationInterceptor extends AbstractInterceptor {

 

    /*

     * 拦截Action处理的拦截方法

     *

     */

    public String intercept(ActionInvocation invocation) throws Exception {

       

        Map session = invocation.getInvocationContext().getSession();

        String userName = (String) session.get("userName");

       

        if (null != userName && userName.equals("test")) {

            System.out.println("拦截器:合法用户登录---");

            return invocation.invoke();

        } else {

            System.out.println("拦截器:用户未登录---");

            return Action.LOGIN;

        }

    }

}
 

 

5.3.    配置权限控制拦截器:
struts.xml:

<!DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

    <package name="my" extends="struts-default">

       

        <interceptors>

        <!-- 定义权限控制拦截器 -->

        <interceptor name="authority" class="org.qiujy.common.AuthorizationInterceptor"/>

        </interceptors>

       

        <!-- 定义全局处理结果 -->

        <global-results>

        <!-- 逻辑名为login的结果,映射到/login.jsp页面 -->

        <result name="login">/login.jsp</result>

        </global-results>

       

        <action name="listall" class="org.qiujy.web.struts2.action.UserAction" method="listAllUser">

            <result name="success">/listall.jsp</result>

            <!-- 使用拦截器 -->

            <interceptor-ref name="defaultStack"/>

            <interceptor-ref name="authority"/>

        </action>

       

        <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">

            <result name="success">/success.jsp</result>

        </action>

    </package>

</struts>
 

       其它页面见源代码。

5.4.    运行调试:
在浏览器地址栏直接输入http://localhost:8080/AuthorityInterceptorDemo/listall.action 来访问,此动作配置了权限拦截器,所有被转到登录页面。


登录后:


再访问http://localhost:8080/AuthorityInterceptorDemo/listall.action 这个链接:

 

 

 


如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈。如下:

<!DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

    <package name="my" extends="struts-default">

 

        <interceptors>

            <!-- 定义权限控制拦截器 -->

            <interceptor name="authority"

                class="org.qiujy.common.AuthorizationInterceptor" />

            <!-- 定义一个包含权限控制的拦截器栈 -->

            <interceptor-stack name="mydefault">

                <interceptor-ref name="defaultStack" />

                <interceptor-ref name="authority" />

            </interceptor-stack>

        </interceptors>

       

        <!-- 定义默认拦截器 -->

        <default-interceptor-ref name="mydefault" />

 

        <!-- 定义全局处理结果 -->

        <global-results>

            <!-- 逻辑名为login的结果,映射到/login.jsp页面 -->

            <result name="login">/login.jsp</result>

        </global-results>

 

        <action name="listall"

            class="org.qiujy.web.struts2.action.UserAction"

            method="listAllUser">

            <result name="success">/listall.jsp</result>

        </action>

    </package>

   

    <package name="font" extends="struts-default">

        <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">

            <result name="success">/success.jsp</result>

        </action>

    </package>

</struts>
 

一旦在某个包下定义了默认拦截器栈,在该包下的所有action都会使用此拦截器栈。对于那些不想使用些拦截器栈的action,则应该将它放置在其它的包下。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qjyong/archive/2007/10/14/1824607.aspx

分享到:
评论
1 楼 wangguanqiu 2009-10-12  
写的不错

相关推荐

    简易图片检索软件(图像动态显示软件)

    首先设置待检索文件夹路径,设置完成解锁开始按钮,点击即可自动查阅文件夹下的图像。可设置每张图像的显示高度、显示停留时间及整体循环次数。 exe应用界面文件在路径disk/load_picture/load_picture.exe 点击exe应用及即可。

    树状数组详解资源.zip

    树状数组

    哈尔滨工程大学单独考试2020考研专业课初试大纲.pdf

    哈尔滨工程大学考研初试大纲

    基于OpenWatcom的链接器的链接器.zip

    链接器 二、链接器主要任务: GNU ld(链接器)是用于将多个目标文件(包括目标文件、共享库、目标文件的归档文件等)合并成一个可执行文件或共享库的重要工具。它的主要功能包括:符号解析和重定位:链接器识别并解析输入文件中的符号引用,然后执行重定位操作以确保这些引用指向正确的地址。这包括将模块中的符号引用与其定义进行匹配,以便在合并时连接它们。 合并输入文件:链接器将多个输入文件中的代码段、数据段等模块合并成一个单一的地址空间。这包括将不同模块中的代码和数据安排到正确的内存地址中。 生成输出文件:链接器将合并的模块和符号表等信息写入输出文件中,该输出文件可以是可执行文件、共享库、目标文件等,具体类型取决于链接器的参数和配置。 符号表处理:链接器生成输出文件的符号表,其中包含了可供调试和动态链接器使用的符号信息。 处理重定位信息:如果存在重定位信息,链接器将生成重定位表,用于在加载时修正代码和数据的地址。这使得程序可以在不同的内存地址上运行。 处理链接器脚本:链接器可以根据链接器脚本(linker script)中的规则和指令来组织和排列模块,以满足特定需求。链接器脚本可以

    tensorflow-2.9.0-cp37-cp37m-win-amd64.whl

    tensorflow安装

    基于STM32或RP2040的Asksinpp CO2传感器

    用于Homematic的CO2传感器,采用STM32或RP2040 pico 受到MHSteve出色工作的启发,我通过以下功能增强了他的解决方案: 使用 STM32 板(Blue Pill 或 Maple Mini)或 RP2040 微微板 与标准传感器外壳 (86x86 mm) 兼容 可选使用 Winsen MH-Z19 CO2 传感器代替 SCD30 使用触摸板作为配置按钮 使用RGB LED代替红绿灯 由于 STM32 和 RP2040 板缺少电池支持以及空间限制,我省略了可充电电池,这对我来说似乎是可以忍受的,因为无论如何都需要电源。

    基于Java的工程项目管理系统(源码+论文+任务书+数据库文件+演示视频).zip

    “工程项目管理系统”主要是为公司的经营活动提供信息服务,系统能够对客户信息管理、订单管理、零件信息管理、供应商管理、库存管理,系统用户管理等信息提供存储、更新、查询、统计的功能,使公司能够合理控制进销存各个环节,提高资金的利用率和结算速度,实现管理的高效率、实时性、安全性、科学化、现代化和智能化。系统的数据来源由各职能部门的业务人员通过键盘输入。此外,对系统的安全性方面也提出了明确的信息要求。 本基于Web技术的B/S结构的系统采用jsp技术进行开发设计,开发环境是MyEclipse,服务器采用tomcat,通过jdbc驱动和数据库进行无缝连接,具有较高的完整性,一致性和安全性。

    SM2258XT Q0407A 闪迪 海力士

    SM2258XT Q0407A 闪迪 海力士

    html如何用html+css写出一个漂亮的“众成教育”页面

    源码+图片资源

    大创研究总结报告pdf

    汽车悬架系统主要由弹性、阻尼元件及悬架导向机构组成,转向机构主要由梯形结构及摇臂机构组成,悬架系统与转向传动机构在运动过程必然引起干涉,这种干涉将引起车轮定位参数的变化,行驶中车轮摆振和轮胎异常磨损、制动时的干涉跑偏、以及稳态转向特性变差等。对于重型及大型车辆而言,悬架系统与转向传动机构的运动干涉问题尤为突出,有时会带来无法弥补的经济损失。

    grpcio-1.14.1-cp35-cp35m-macosx_10_7_intel.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    cryptography-2.2.1-cp34-abi3-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASP+ACCESS客户管理信息系统(开题报告+源代码+论文+答辩PPT)【ASP】.zip

    ASP+ACCESS客户管理信息系统(开题报告+源代码+论文+答辩PPT)【ASP】

    PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip

    PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、项目初期立项演示等用途。 4.如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能。 PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip

    yolo开发教程以及案例

    yolo开发教程以及案例

    分享一个比较万能的Python爬虫案例

    分享一个比较万能的Python爬虫案例

    jsptop200.txt

    jsptop200

    协同过滤 简单web+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    919362194569161草莓视频11.1.apk

    919362194569161草莓视频11.1.apk

    grpcio-1.20.1-cp36-cp36m-macosx_10_9_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics