自定义拦截器解决Struts2重复提交问题

需积分: 10 3 下载量 173 浏览量 更新于2024-09-11 收藏 55KB DOC 举报
在Struts2框架中,由于标签的性能问题,项目团队考虑到了一种更高效的方式来防止表单重复提交。通常,Struts2自带的拦截器如`PreparableParamsInterceptor`可用于处理这类需求,但它们与Struts标签紧密耦合。为了实现不依赖Struts标签的防重复提交功能,开发者可以选择自定义拦截器。 首先,开发人员需要创建一个新的拦截器类,例如`TokenActionInterceptor`,继承自`AbstractInterceptor`。这个拦截器的核心职责是在每个请求处理阶段检查是否已存在一个令牌,如果发现重复提交,则重置令牌并返回错误信息。以下是该拦截器的主要部分: 1. 拦截器类 (`TokenActionInterceptor`): - 在`intercept()`方法中,获取当前会话(`Session`)和HTTP请求对象。 - 使用`RandomGUIDUtil`生成一个新的唯一令牌(`strGUID`),这个工具类可能包含了生成随机字符串或安全哈希值的方法。 - 检查会话中的令牌(`strRequestToken`)是否与表单提交的令牌(`strToken`)相同,若不同则说明有重复提交。 - 如果发现重复提交,将新的令牌存储回会话和请求属性,并返回预设的错误页面(`"invalidToken"`)。 - 否则,继续执行正常的动作调用(`invocation.invoke()`)。 2. 辅助工具类 (`RandomGUIDUtil`): - 这个类负责生成安全的、唯一的令牌,如使用MD5哈希算法对用户不可预测的数据进行加密。它可能包含一个`generateGuid()`方法,用于生成基于某种规则的随机字符串。 自定义拦截器的优势在于,它可以独立于Struts2标签,使代码更加模块化且易于维护。同时,通过这种方式,开发者可以根据项目需求调整令牌生成策略,提高安全性。然而,需要注意的是,虽然实现了防重复提交,但仍可能存在其他攻击手段,如CSRF(跨站请求伪造),因此在实际应用中可能还需要结合其他安全措施来加强保护。