最近处理以前项目的一些漏洞需要对from中的String字段做一下过滤再显示到页面,每一个action都做修改是不现实的,原本想写个servlet来处理但是考虑有些麻烦,因此搜了一下拦截器发现有人实现了struts1的拦截器,用这个比较方便,感谢这些奉献的人!
关于struts1的拦截器,一般是通过struts插件进行注册,网络上有2个开源组件的实现。
saif-0[1].1.jar和saif-spring.jar(该包依赖spring-webmvc-struts.jar包),不知2者是什么关系,本人根据比较后使用的是前者。下面详细介绍这2个组件:
现实一个action
/**
*
*/
package com.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* @author Administrator
*
*/
public class TestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("testt ......");
return mapping.findForward("index");
}
}
struts配置:
<action-mappings>
<action path="/browser" type="com.test.TestAction">
<forward name="index" path="/index.jsp" />
<forward name="index0" path="/index0.jsp" />
</action>
</action-mappings>
1、saif
a.实现拦截器
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class DisplayInterceptor implements net.sf.struts.saif.ActionInterceptor {
public void afterAction(Action arg0, ActionMapping arg1, ActionForm arg2,
HttpServletRequest arg3, HttpServletResponse arg4)
throws IOException, ServletException {
System.out.println("after interceptor......");
}
public void beforeAction(Action arg0, ActionMapping arg1, ActionForm arg2,
HttpServletRequest arg3, HttpServletResponse arg4)
throws IOException, ServletException {
System.out.println("before interceptor......");
}
}
这里也可以继承自ComponentInterceptor类。
b.拦截器配置文件interceptor-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<interceptor-config>
<interceptor name="displayInterceptor" type="com.test.DisplayInterceptor"/>
<default-interceptors>
<interceptor name="displayInterceptor"/>
</default-interceptors>
</interceptor-config>
c.struts配置文件中配上该插件
<plug-in className="net.sf.struts.saif.SAIFPlugin">
<set-property property="interceptor-config" value="/WEB-INF/interceptor-config.xml"/>
</plug-in>
d.部署完毕有即可测试。
2、saif-spring.jar+spring-webmvc-struts.jar
a.实现拦截器
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DisplaySpringInterceptor implements net.sf.struts.saif.ActionHaveForwardInterceptor {
public ActionForward afterAction(Action arg0, ActionMapping arg1,
ActionForm arg2, HttpServletRequest arg3, HttpServletResponse arg4)
throws IOException, ServletException {
System.out.println("after Spring interceptor......");
return arg1.findForward("index0");
}
public ActionForward beforeAction(Action arg0, ActionMapping arg1,
ActionForm arg2, HttpServletRequest arg3, HttpServletResponse arg4)
throws IOException, ServletException {
System.out.println("before Spring interceptor......");
return arg1.findForward("index0");
}
}
b.拦截器配置文件interceptor-config1.xml
<?xml version="1.0" encoding="UTF-8"?>
<interceptor-config>
<interceptor name="displayInterceptor1" type="com.test.DisplaySpringInterceptor"/>
<action type="/browser">
<interceptor name="displayInterceptor1" />
</action>
<!--
<default-interceptors>
<interceptor name="displayInterceptor1"/>
</default-interceptors>-->
</interceptor-config>
c.struts配置文件中配上该插件
<plug-in className="net.sf.struts.saif.SAIFSpringPlugin">
<set-property property="interceptor-config" value="/WEB-INF/interceptor-config1.xml"/>
</plug-in>
d.部署完毕有即可测试。
注意:测试时要屏蔽一个插件,不能同时使用。
区别:1)前者不能针对某个action进行拦截而后者可以,但不能拦截到具体的方法;因此前者配置为默认拦截,后者可以默认也可以指定action,<action type="/browser"> 这里是action的名称。
2)前者依次执行完 beforeAction 、action和afterAction后跳转到action的ActionForward路径。后者执行beforeAction后如果该方法返回的ActionForward不为null就会执行跳转因此action将不会执行,如果为null则继续执行action;同样action的ActionForward不为null也执行跳转,afterAction则不会执行;否则就执行并跳转到afterAction的ActionForward路径。
以上执行逻辑与反编译后的代码是一致的,代码如下:
saif.jar ->net.sf.struts.saif.SAIFRequestProcessor
/* */ protected ActionForward processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping)
/* */ throws IOException, ServletException
/* */ {
/* 89 */ this.helper.beforeAction(request, response, action, form, mapping);
/* */
/* 91 */ ActionForward forward = super.processActionPerform(request, response, action, form, mapping);
/* */
/* 94 */ this.helper.afterAction(request, response, action, form, mapping);
/* */
/* 96 */ return forward;
/* */ }
/* */ }
saif-spring.jar ->net.sf.struts.saif.SAIFSpringRequestProcessor
protected ActionForward processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping)
/* */ throws IOException, ServletException
/* */ {
/* 58 */ ActionForward forward = this.helper.beforeAction(request, response, action, form, mapping);
/* 59 */ if (forward != null) {
/* 60 */ return forward;
/* */ }
/* 62 */ forward = super.processActionPerform(request, response, action, form, mapping);
/* 63 */ if (forward != null) {
/* 64 */ return forward;
/* */ }
/* 66 */ forward = this.helper.afterAction(request, response, action, form, mapping);
/* */
/* 68 */ return forward;
/* */ }
/* */ }
这2个实现都继承org.apache.struts.action.RequestProcessor。
完整的工程在附件中。
分享到:
相关推荐
4. **插件使用**:Struts1.2提供了一些预定义的拦截器插件,例如`TilesPlugin`用于集成Tiles视图技术,`ValidationPlugin`用于表单验证,`I18nPlugin`用于国际化支持。这些插件可以通过简单的配置就能引入到项目中,...
SAIF插件是Struts1中一个特定的拦截器实现,用于增强框架的功能。 **1. Struts1 拦截器原理** 拦截器的工作机制是基于责任链模式,它将一系列拦截器按照预设的顺序串联起来,形成一条处理链。当请求到达时,会依次...
总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...
"saif(struts1 interceptor)"插件实现了类似Struts2的拦截器机制,使开发者可以在Struts1中创建和配置拦截器,实现对请求的拦截和处理。以下是一些关键知识点: 1. **拦截器链**:在Struts1中,拦截器被组织成一个...
在Struts2框架中,拦截器是一种插件机制,可以理解为一系列动作调用前后的处理程序。它们按照预定义的顺序执行,允许开发者在不修改Action代码的情况下,添加额外的功能或行为。例如,数据验证、日志记录、性能监控...
在Struts2框架中,拦截器是一种插件机制,它可以拦截用户的HTTP请求,在Action执行前后进行额外的操作,如日志记录、权限检查、数据验证等。拦截器按照定义的顺序依次执行,形成一个拦截器链。 ### 2. 拦截器的工作...
通过以上步骤,我们就完成了Struts2和Spring的整合,Action实例由Spring管理,并且能够使用自定义的拦截器。这种整合方式让开发者能够充分利用两者的优点,提高代码的可维护性和可扩展性。 值得注意的是,Struts2_...
Struts2的核心功能包括动作调度、结果映射、拦截器等,而其强大的扩展性则体现在众多插件的使用上。这篇博文主要探讨的是Struts2中的"convention-plugin",这是一个自动配置插件,极大地简化了开发过程。 在传统的...
开发过程中,IDE如IntelliJ IDEA提供了很好的插件支持,方便创建、配置和调试Struts 2拦截器。此外,使用Maven或Gradle构建项目时,可以通过依赖管理轻松引入Struts 2框架。 ### 实战应用 实际开发中,可以结合业务...
这些功能可以通过编写自定义拦截器或者使用Struts2提供的内建拦截器实现。 Struts2内建拦截器包括: 1. **Params拦截器**:处理请求参数,将它们设置到Action上下文中,便于后续Action使用。 2. **Prepare拦截器**...
### Struts2-Convention插件使用详解 #### 引言 自Struts2.1版本起,Convention插件被引入,旨在替代原有的Codebehind插件,实现框架内的零配置理念。这一插件的设计思想围绕着减少XML配置的依赖,通过代码结构与...
开发过程中,IDEA等集成开发环境提供了便捷的方式来配置和调试拦截器,如通过Maven插件自动生成struts.xml配置文件。 总的来说,Struts2的核心拦截器是实现业务逻辑和控制流程分离的关键机制,它增强了代码的可维护...
5. **commons-logging.jar**:这是一个日志抽象层,Struts1使用它来记录框架内部的日志信息,开发者可以根据需求选择具体的日志实现,如log4j、java.util.logging等。 6. **spring.jar**:虽然标题中没有直接提及...
在给定的标签“源码”和“工具”中,我们可以理解到,这个压缩包可能包含了示例代码或者一些工具,如IDE插件,用于帮助开发者更好地理解和使用Struts2自定义拦截器。文件名`strutsdemo`可能是一个简单的Struts2演示...
6. **拦截器(Interceptor)**:Struts2的校验过程是由一系列拦截器完成的,如`ValidationInterceptor`负责调用校验规则。开发者可以通过调整拦截器栈顺序或添加自定义拦截器来定制校验流程。 7. **国际化支持**:...
Struts 2整合Struts 1,允许开发者利用Struts 1已有的投资,同时享受Struts 2带来的优势,如增强的类型安全和更强大的拦截器机制。 在《Struts 2权威指南--基于WebWork核心的MVC开发》这本书中,作者李纲深入浅出地...
Struts2.2.3是稍后的一个更新版本,它在2.0.19的基础上做了许多改进和增强,例如增加了更多的拦截器、扩展了标签库、提升了性能和稳定性,并且对Ajax和RESTful的支持也有所加强。对于新项目或者需要更先进特性的...
Struts2.0是Apache软件基金会的一个开源项目,它继承了Struts1.x的优点并解决了其不足,引入了拦截器(Interceptor)机制,使得业务逻辑与控制逻辑分离得更加彻底。Struts2.0支持多种结果类型,如Redirect、Stream等...