Struts2——拦截器(Interceptor)

联邦学习模型投毒研究进展 在联邦学习中,多个设备(如移动设备、IoT设备等)本地训练模型,然后将更新的模型参数上传到服务器进行聚合。 阅读详情

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

1、Struts2中内置的拦截器

常见的拦截器:
(1)params拦截器
这个拦截器把请求参数设置到相应的Action的属性去,并自动进行类型转换。
(2)modelDriven拦截器
如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。
(3)execption拦截器
顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。
(4)validation拦截器
调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。
(5)token拦截器
核对当前Action请求(request)的有效标识,防止重复提交Action请求。
(6)fileUpload拦截器
用来处理文件上传
(7)workflow拦截器
调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图
(8)servletConfig
通过感知接口,获取感应对象

2、自定义拦截器

(1)步骤:

①自定义一个类,继承AbstractInterceptor抽象类,或实现Interceptor接口

②在struts.xml配置文件中注册拦截器

③在struts.xml配置文件中,设置默认拦截器或配置Action类的局部拦截器来使用。

(2)eg:该示例自定义拦截器拦截主页面,防止未登录用户强行登陆主页面。

①CheckLoginInterceptors.java(拦截器)

public class CheckLoginInterceptors extends AbstractInterceptor{

	private static final long serialVersionUID = 1L;
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//获取Session对象中的用户信息
		String username = (String) ActionContext.getContext().getSession().get("USER_IN_SESSION");
		if(username!=null){
			return invocation.invoke();//如果username不为空,放行
		}
		return "input";//否则返回登录页面
	}
}
②LoginAction.java

public class LoginAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	private String username;
	private String password;
	
	@Override
	public String execute() throws Exception{
		System.out.println(username+","+password);
		//将用户名存入Session对象中
		ActionContext.getContext().getSession().put("USER_IN_SESSION", username);	
		return "success";
	}
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

③struts.xml

<package name="interPkg" extends="struts-default" namespace="/">
		<!-- 注册拦截器 -->
		<interceptors>
			<interceptor name="checkLogin" class="interceptors.CheckLoginInterceptors"/>
		</interceptors>
		<!-- 指定默认拦截器 -->
		<default-interceptor-ref name="checkLogin"/>
		<!-- 全局视图 -->
		<global-results>
			<result name="input">
				/views/login/login.jsp
			</result>
		</global-results>

		<action name="login" class="action.interceptors.LoginAction">
                       <result name="success" type="redirectAction">
				<param name="namespace">/</param>
				<param name="actionName">main</param>
			</result>
		</action>

		<action name="main">
			<result name="success" type="dispatcher">
				/views/login/welcome.jsp
			</result>
		</action>
	</package>
上述代码存在问题:

a.登陆失败,永远进不了LoginAction

原因:进入LoginAction之前,需要判断session中是否有USER_IN_SESSION,而USER_IN_SESSION只有在LoginAction中才能设置。
结论:LoginAction不需要做登陆检查。

b.在LoginAction中再也获取不了请求参数

原因:当我们在<package>设置了默认的拦截器引用,那么<package>之前的默认的拦截器栈(defaultStack)就不引用了,那么defaultStack中的获取请求参数的拦截器也不再引用。

应改为如下:

	<package name="interPkg" extends="struts-default" namespace="/">
		<!-- 注册拦截器 -->
		<interceptors>
			<interceptor name="checkLogin" class="interceptors.CheckLoginInterceptors"/>
			<!-- 自定义拦截器栈,可放置多个拦截器 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="checkLogin"/>
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器 -->
		<default-interceptor-ref name="myStack"/>
		<!-- 全局视图 -->
		<global-results>
			<result name="input">
				/views/login/login.jsp
			</result>
		</global-results>
		
		<action name="login" class="action.interceptors.LoginAction">
		<!-- 配置局部拦截器 -->
		<interceptor-ref name="defaultStack"/>
			<result name="success" type="redirectAction">
				<param name="namespace">/</param>
				<param name="actionName">main</param>
			</result>
		</action>
				
		<action name="main">
			<result name="success" type="dispatcher">
				/views/login/welcome.jsp
			</result>
		</action>
	</package>

④测试



使用隐身窗口重新登陆,试图登陆主页


Qt插件之Qt Designer插件实现 相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。... 阅读详情

相关推荐

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3219

Struts2之拦截器

Struts2之拦截器

qq_42640067的博客 1523

大学生电赛学习之路

可以看到全国大学生电子设计大赛的认可度是非常高的,属于A类学科竞赛。电子设计大赛的形式也是给出题目,参赛者有四天三夜的时间解决问题,题目大致可以分为:控制类、测量类、高频类以及电力电子类。该竞赛会在单数年的9月份举行。但是对于新生来说电赛确实遥不可及的,可能在很多学校本科生是不能进入实验室的,但是就算进了实验室你就有资格去参加电赛或者说能拿一个不错的奖项吗? 现在正值新生开学季,当然会有一大批学生会进入实验室的学习,电赛的举办时间是每年的暑假,所以说对于大一同学来说有一年的时间去准备,那我们就来说一说参加.

weixin_46098612的博客 8788

5.Struts 2拦截器(Interceptor)

任何优秀的MVC框架都会提供一些通用的操作,如请求数据的封装、类型转换、数据校验、解析上传的文件、防止表单的多次提交等。 Struts 2将它的核心功能放到拦截器中实现而不是集中在核心控制器中实现,把大部分控制器需要完成的工作按功能分开定义,每个拦截器完成一个功能,而完成这些功能的拦截器可以自由选择、灵活组合,需要哪些只需要在struts.xml指定即可,从而增加了框架的灵活性,有利于系统解耦。 拦截器的方法在Action执行之前或者执行之后自动的执行,从而将通用的操作动态地插入到了可插拔式。

相互学习 共同进步 1039

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

struts2之拦截器详解

文章目录1 拦截器1.1 拦截器是什么1.2 拦截器的优点是什么1.3 预定义拦截器1.3.1 预定义拦截器1.3.1.1 params拦截器1.3.1.2 timer拦截器1.3.1.3 logger拦截器1.3.2 拦截器配置说明1.3.3 拦截器的调用顺序1.3.4 全局拦截器的配置1.3.5 使用execAndWait拦截器1.4 自定义拦截器1.4.1 自定义基础拦截器1.4.2 自定义拦截器示例1.4.3 自定义登录检查拦截器1.4.4 自定义logger拦截器 1 拦截器 1.1 拦截器是什么

上善若泪 2826

南 京 农 业 大 学 试 题 纸 附表(rape.csv)是25个油菜材料,测得每个材料的千粒重、亚油酸等的含量. (1) 对物质含量的八个指标作主成分分析,画出碎石图和主成分得分图; (2) 选

(1)请用n1

Mrrunsen的博客 497

Struts2的拦截器

关于自定义拦截器的建立

ccb1372098的博客 778

升级conda时出现Malformed version string invalid chars错误解决方案

但有时,当你使用“conda upgrade”的命令时,你可能会遇到一个错误,提示你的环境解析失败,出现“Malformed version string invalid chars”错误消息。如果以上两个步骤都没有解决你的问题,那么你可以考虑更新conda的依赖项。如果你的conda版本已经是最新的,那么你需要清理conda的缓存。最后,如果以上方法都无法解决问题,你可以尝试使用pip进行更新。如果你的conda版本过旧,你需要先更新conda。首先,你需要确认你当前使用的conda版本。

BUG?不存在的! 1409

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 326

Struts2拦截器Interceptor创建与配置

一、Interceptor类创建这里有一点需要注意:如果放行了,就不会再执行最后return的结果了,参考论坛讨论:https://bbs.youkuaiyun.com/topics/370194837 12楼的回答:楼上是正解,这是struts2的机制,只要调用 invoke()方法后,如果能成功的调用了对应Action类中的方法,strtus2就会按照该方法的返回值去找对应的result,从而忽略拦截器的...

javae100的博客 4152

基于Simulink的固态变压器(SST)多级协同控制

本文基于Simulink平台,详细介绍了固态变压器(SST)多级协同控制的建模与仿真方法。针对SST三级架构(AC-DC、DC-DC、DC-AC)存在的级间耦合问题,提出了纵向解耦与横向联动的协同控制策略。通过搭建10kV/400V级联型SST系统模型,实现了输入电压波动±20%或负载0-100%跳变时直流母线电压波动小于2%的控制目标。文章详细讲解了Simulink建模步骤、控制算法推导及工程部署建议,包括功率前馈控制、虚拟惯性算法等关键技术。仿真结果表明,该协同控制方案能有效抑制负载突变时的电压波动,为

MHD0815的博客 214

struts2拦截器interceptor的三种配置方法

1、struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 package name="struts2" extends="struts-default"> class="edu.hust.action.RegisterAction">

Golden_lion的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

浅谈Struts2拦截器Interceptor的设计原理

使用过struts2框架的朋友们都知道 拦截器Interceptor 在struts2中的地位是非常重要的,可以说是struts2在控制流调度部分的核心,并且struts2做为一个MVC框架,之所以在 controller层有如此强大的扩展能力,完全是由其拦截器的设计决定的,我们先看看下面这张图:

FcBayernMunchen的专栏 4962

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

struts2 拦截器 interceptor

在之前的文章中,我们已经涉及到了拦截器(Interceptor)的概念。  downpour 写道 拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。正如上面 Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前

vsddvsd的专栏 463

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Struts2拦截器(Interceptor)的生命周期和使用

一、Interceptor的生命周期 1.初始化拦截器 @Override public void init() { // TODO Auto-generated method stub System.out.println("拦截器初始化"); } 2.拦截器执行 @Override public String intercept(ActionInvocation actionInvoca...

哈利路亚里路亚 965

Struts2 的核心——拦截器[Interceptor]

详细介绍了 Struts2中拦截器的执行原理、什么是拦截器、拦截器的配置和使用。

乐乐的专栏 3171

Struts2 拦截器的Interceptor接口与AbstractInterceptor抽象类

在学习Struts2框架的时候,遇到了拦截器,一开始拦截器都应该之间或者间接去实现Interceptor接口的,但是后来看到了AbstractInterceptor这个抽象类。之前学过的JAVA知识有点忘记了,所以特意查了一下关于抽象类和接口之间的关系。我们不想使用Interceptor接口去实现拦截器对象,是因为这个接口中有3个方法,但是我们在实际上我们主要用到的就是只有intercept()这

sinat_36841379的博客 2012

struts2-自定义struts拦截器interceptor

自定义拦截器的步骤

青树寒鸦的博客 192

Struts2 拦截器 Interceptor结构

为什么80%的码农都做不了架构师?>>> ...

weixin_33810006的博客 120

Struts2中的(Interceptor)拦截器的执行顺序

Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法。而它所依赖的参数ActionInvocation则是我们之前章节中曾经提到过的著名的Action调度者。   Java代码   public abstract class AroundInterceptor extends A

这个少女IT男的博客 2403

struts2完成图片上传与拦截器Interceptor

struts2完成图片上传与拦截器Interceptor 图片上传: 今天在上次增删查改struts增删查改的要达到的效果:把图片上传到服务器并保存到本地,并且在jsp页面展示出来 效果如下图所示: 总共有三种上传方案: 1、上传到tomcat服务器 2、上传到指定文件目录,添加服务器与真实目录的映射关系,从而解耦上传文件与tomcat的关系文件服务器 3、在数据库表中建立二进制字段,将图片存...

hao_dream_xi的博客 153

Struts2--拦截器Interceptor

  拦截器是的我们可以在方法的执行前后定义执行的操作。可以作为一个非常有力的工具在数据验证,属性设置,安全,日志等等方面。   拦截器可以链接起来形成一个拦截器栈。框架会按照拦截器定义的顺序依次调用这些拦截器栈里的拦截器。   有时候还可以定义一个默认的拦截器(栈). <default-interceptor-ref name="secureStack"/> ...

dengjuyan2649的博客 187

struts2拦截器(interceptor) 笔记

创建一个Interceptor 可以自定义一个类实现com.opensymphony.xwork2.interceptor.Interceptor在这个接口中有三个方法 init destory intercept, intercept方法是真正拦截的方法。 在intercept方法中如果要向下继续执行,通过其参数ActionInvocation调用它的invoke()方法就可以。

我们始终是路人 371
上一篇: Struts2 入门
下一篇: Struts2——文件上传、下载
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值