Struts2教程8:拦截器概述

Struts2自定义拦截器实战教程 本文还有配套的精品资源,点击获取 简介:Struts2框架是Java Web应用程序的强大工具,其中拦截器是其核心特性之一。通过本教程,你将学习如何创建和配置自定义拦截器,实现对请求的处理逻辑,如日志记录和权限检查。我们将通过定义Java类并实现Interceptor接口或AbstractInterceptor抽象类来创建拦截器,并在Struts2的配置文件中进行声明和配置... 阅读详情
 

Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。

Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:


void destroy();
void init();
String intercept(ActionInvocation invocation) 
throws Exception;

其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:

<package name="demo" extends="struts-default" > ... </package>

     在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:


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

<interceptor-stack name="defaultStack">  
   
<interceptor-ref name="exception"/>
    
<interceptor-ref name="alias"/>
    
<interceptor-ref name="servletConfig"/>
    
<interceptor-ref name="prepare"/>
    
<interceptor-ref name="i18n"/>
    
<interceptor-ref name="chain"/>
    
<interceptor-ref name="debugging"/>
    
<interceptor-ref name="profiling"/>
    
<interceptor-ref name="scopedModelDriven"/>
    
<interceptor-ref name="modelDriven"/>
    
<interceptor-ref name="fileUpload"/>
    
<interceptor-ref name="checkbox"/>
    
<interceptor-ref name="staticParams"/>
    
<interceptor-ref name="params">
        
<param name="excludeParams">dojo/..*</param>
    
</interceptor-ref>
    
<interceptor-ref name="conversionError"/>
    
<interceptor-ref name="validation">
           
<param name="excludeMethods">input,back,cancel,browse</param>
     
</interceptor-ref>
     
<interceptor-ref name="workflow">
            
<param name="excludeMethods">input,back,cancel,browse</param>
     
</interceptor-ref>
</interceptor-stack>

上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用(如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解)。

下面我们来看几个简单的拦截器的使用方法。

一、记录拦截器和execute方法的执行时间(timer)

     timer是Struts2中最简单的拦截器,这个拦截器对应的类是com.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执行的时间总和。如下面的配置代码所示:

<action name="first" class="action.FirstAction">
    
<interceptor-ref name="logger"/>
    
<interceptor-ref name="timer" />
</action>

由于在timer后面没有其他的拦截器定义,因此,timer只能记录execute方法的执行时间,在访问first动作时,会在控制台输出类似下面的一条信息:

信息: Executed action [/test/first!execute] took 16 ms.

     在使用timer拦截器时,需要commons-logging.jar的支持。将logger引用放到timer的后面,就可以记录logger拦截器的intercept方法和Action的execute方法的执行时间总和,代码如下:

<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<interceptor-ref name="logger"/>
</action>

大家可以使用如下的Action类来测试一下timer拦截器:

package action;

import com.opensymphony.xwork2.ActionSupport;

public class FirstAction extends ActionSupport          

{
       
public String execute() throws Exception

       {
           Thread.sleep(
1000); // 延迟1秒
          
return null;
       }

}

如果只记录execute方法的执行时间,一般会输出如下的信息:

信息: Executed action [/test/first!execute] took 1000 ms.

二、通过请求调用Action的setter方法(params)


   
当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:

<s:form action="first" namespace="/test">
   
<s:textfield name="name"/>
   
<s:submit/>
</s:form>

在提交后,Struts2将会自动调用first动作类中的setName方法,并将name文本框中的值通过setName方法的参数传入。实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。

<action name="first" class="action.FirstAction">

    ... ...

</action>

但如果在<action>中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:


<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<interceptor-ref name="params"/>
</action>

三、通过配置参数调用Action的setter方法(static-params)

    static-params拦截器可以通过配置<params>标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。
    下面配置代码演示了如何使用static-params拦截器:


<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<param name="who">比尔</param>
    
<interceptor-ref name="params"/>
    
<interceptor-ref name="static-params"/>
</action>

如果first动作使用上面的配置,在访问first动作时,Struts2会自动调用setWho方法将“比尔”作为参数值传入setWho方法。

四、使用拦截器栈

     为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。代码如下:
<package name="demo" extends="struts-default" >
    
<interceptors>
        
<interceptor-stack name="mystack">
            
<interceptor-ref name="timer" />
            
<interceptor-ref name="logger" />
            
<interceptor-ref name="params" />
            
<interceptor-ref name="static-params" />
        
</interceptor-stack>
    
</interceptors>

    
<action name="first" class="action.FirstAction">
        
<param name="who">比尔</param>
        
<interceptor-ref name="mystack"/>            
    
</action>
</package>

    可以象使用拦截器一样使用拦截器栈,如上面代码所示。

STM32驱动WS2812B灯带:PWM+DMA高效刷新方案 嵌入式系统中,精准时序控制是驱动数字LED灯带的关键。WS2812B作为常见可编程LED,要求每个数据位具有严格的高电平宽度,常需借助定时器生成稳定波形。传统GPIO模拟时序在灯珠数量增多时易受中断影响,而结合STM32的PWM与DMA技术,能将比较值自动搬运至定时器寄存器,实现硬件级波形输出,大幅降低CPU负担并提升刷新率。本文以STM32F103为例,分析WS2812B时序量化、PWM配置、DMA链路及色序处理,并给出调试查障的通用方法,帮助开发者快速实现高效稳定的灯带驱动。 阅读详情

相关推荐

EEGLAB合辑 | 第一节 往EEGLAB导入数据

1、学习Matlab EEGLAB图形界面建立在强大的Matlab脚本语言之上。要使用EEGLAB构建宏命令和执行自定义和自动化处理的全部功能,就需要能够在Matlab中操纵EEGLAB数据结构。由于时间限制,这个wiki没有提供关于Matlab脚本语言的介绍。相反,用户需要在开始研究之前熟悉Matlab。 2、安装EEGLAB和教程文件 首先下载包含教程数据集的EEGLAB(30MB),附下载地址。 (https://sccn.ucsd.edu/eeglab/downloadtoolbox.php) 解压

nvsirgn的博客 5133

struts2自定义拦截器

问题?struts2自定义拦截器的作用是什么?在我的另外一篇servlet文章中提到的。在用户登录的时候回用到session啦来给标记,但是在三大框架的过程中没有servet,那该怎么办呢? 这个时候我们就需要自定义拦截器来做这个登录事情了。 在此做这个之前要把struts2的环境搭好喔!详情:http://blog.youkuaiyun.com/mr_li13/article/details/49391

Mr_li13的博客 780

Kali实战:构建安卓远程监控工具,实现拍照、定位与信息获取

本文详细介绍了如何使用Kali Linux构建安卓远程监控工具,实现拍照、定位与信息获取功能。通过Metasploit框架生成安卓载荷,部署到目标设备并建立连接,执行远程监控操作如获取位置信息、拍照和读取通讯录。文章还提供了进阶技巧与问题排查方法,强调法律与道德考量。

weixin_28716443的博客 239

开发小问题_struts2_关闭开发者模式下参数的提示信息

在struts2的开发者模式下,当提交的表单的某一参数在Action没有对应属性时,会进行提示。 如repassword为密码确认参数,在Action中没有对应的属性,此时提示如下:    改变struts源码,关闭提示 自定义一个类,类名为: com.opensymphony.xwork2.interceptor.ParametersInterceptor   ...

hanaii的博客 632

智能制造 | 如何快速自动生成站位表及自动与BOM校验?

一、站位表(SMT行业中)是SMT上料防错的基础信息,用于对需上料物料与产线、贴片机位置、飞达规格型号、用量,建立基础资料。 SMT站位表是否正确? 首先需要人工确认站位表与SMT程序的是否符合,上料员依照站位表安装好后,确认人员需有第三方确认者 (品管确定)核对。 站位表内容包括什么? 站位表内容为:SMT站位号相对应的物料编码,元件位号,飞达大小/间距,数量等等,根据不同公司的要求而定义。 就目前来说,基本每一款贴片机都可以输出站位清单 但对于企业来说,直接输出的站位清单一般不直接使用,需要进行手动处理

vayoinfo111的博客 4942

深度学习模型轻量化方法之【量化】

量化虽然有着硬件友好和功效提升的特点,但它也引入了模型性能的折衷。因此,设计有效的量化策略需要在模型大小、性能以及运算速度之间做出平衡。随着深度学习算法和硬件加速技术的快速发展,量化方法在使深度网络轻量化和提高部署效率方面持续发挥着重要作用。

m0_73916791的博客 2846

ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts...

当struts.devMode设置为true时,html表单数据中有和action属性匹配不上的参数名时就会被这样显示出来,没什么大碍,就是为了便于使用者调试。struts.devMode设置为false就没有了。 我也是找了半天原因,才看到这句话,其实人家早就指出解决方法了,set struts.devMode to false to disable this message 转载...

aa120314484的博客 801

LaTeX伪代码字体大小调整全攻略:从algorithm到algorithm2e的实战技巧

本文详细介绍了在LaTeX中调整伪代码字体大小的全面技巧,涵盖algorithm、algorithmicx和algorithm2e等主流算法包的使用方法。从基础命令到高级配置,帮助用户解决学术论文和技术文档中的伪代码排版问题,提升算法展示的专业性和可读性。特别针对不同期刊格式要求,提供了实用的字体调整方案。

weixin_29297127的博客 436

Struts2--自定义拦截器三种方式(实现Interceptor接口、继承抽象类AbstractInterceptor、继承MethodFilterInterceptor)

实现自定义拦截器 在实际的项目开发中,虽然 Struts2 的内建拦截器可以完成大部分的拦截任务,但是,一些与系统逻辑相关的通用功能(如权限的控制和用户登录控制等),则需要通过自定义拦截器实现。本节将详细讲解如何自定义拦截器。 1.实现Interceptor接口 在 Struts2 框架中,通常开发人员所编写的自定义拦截器类都会直接或间接地实现 com.opensymphony.xwork2.in...

吴声子夜歌的博客 3293

基于CNN网络的轴承故障诊断

内容参考:《基于卷积神经网络的轴承故障 诊断算法研究》–张伟 代码参考: https://github.com/AaronCosmos/wdcnn_bearning_fault_diagnosis 1 背景: 基于信号处理的特征提取+分类器的传统智能诊断算法,对专家经验要求高,设计耗时且不能保证通用性,已经不能满足机械大数据的要求。提出使用基于卷积神经网络智能诊断算法来自动完成特征提取以及故障识别。 1.1 挑战 机电产品故障诊断面临的挑战,有三大特点: (1)数据量大,专业分析人员的数量严重不足,仅依靠人

weixin_45679938的博客 7万+

论文必备 - YOLO26热力图可视化,支持指定模型,指定显示层,设置置信度,以及9种可视化实现方式

本文带来的是YOLO26热力图可视化功能,支持指定模型,指定显示层,设置置信度,以及9种可视化实现方式。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如Centralized Feature Pyramid for Object Detection这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。在项目

Limiiiing的博客 430

团队协作的底层逻辑:从目标对齐、角色认知到沟通机制

团队协作是任何组织追求高效产出的核心基础,其本质在于通过系统化的机制将个体能力整合为集体战斗力。从原理上看,有效的协作并非依赖于私人关系,而是构建于清晰的目标对齐、明确的角色分工与高效的沟通机制三大支柱之上。在技术价值层面,这套框架能够显著提升决策质量、资源利用效率和团队应变能力,尤其适用于电竞战队、软件开发团队、项目小组等需要高度协同的场景。本文以电竞团队为例,深入探讨了如何通过复盘流程优化、针对性训练设计及第三方视角引入,解决诸如‘目标冲突’、‘角色错位’及‘信息过载’等常见协作瓶颈,为面临类似‘小团体

keke1314520的博客 404

游戏大厂如何解析引擎技术

本文系统解析了游戏大厂如何评估和定制游戏引擎。游戏引擎作为游戏开发的核心基础,大厂会从性能、跨平台支持、渲染能力、网络模块等8个维度进行技术解析,通过文档查勘、源码阅读、Demo测试等7个步骤深度评估。解析后通常有三种决策:直接使用、深度定制或自研重构。文章以腾讯、网易、米哈游等为例,展示了不同厂商的引擎定制策略,并分析了技术解析面临的挑战和未来趋势。最终指出,体系化的引擎技术解析是打造高质量游戏的关键,需要持续的技术投入和团队协作。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 535
上一篇: Struts2教程7:上传任意多个文件
下一篇: Struts2教程9:实现自已的拦截器
binboot
博客等级 码龄19年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值