在Java Web开发中,处理敏感表单数据时,加密是一个必不可少的安全环节。如果你正在使用Struts2框架,那么通过实现ActionForm接口来集成加密逻辑,是一种经典且有效的实现方式。本文将从零开始拆解整个流程,详细说明如何安全地完成从表单提交到业务处理的加密数据流转,帮助你在Struts2项目中轻松实现表单数据加密。

第一步:构建自定义的Form类
关键在于创建一个实现ActionForm接口的类,例如命名为MyForm。这个类不仅要承载表单提交的数据,还需要能够获取原始的请求参数,以便后续进行加密处理。通过实现ServletRequestAware接口,我们可以轻松拿到HttpServletRequest对象,从而获得完整的参数映射表。
import org.apache.struts2.interceptor.ServletRequestAware;
import ja vax.servlet.http.HttpServletRequest;
import ja va.util.Map;
public class MyForm implements ActionForm, ServletRequestAware {
private Map requestParams;
private String secretField;
// Getter and Setter methods for secretField
public String getSecretField() {
return secretField;
}
public void setSecretField(String secretField) {
this.secretField = secretField;
}
// 实现ServletRequestAware接口,获取原始请求参数
@Override
public void setServletRequest(HttpServletRequest request) {
requestParams = request.getParameterMap();
}
// 重写reset方法,用于清理加密字段
@Override
public void reset() {
secretField = null;
}
}
第二步:在JSP视图中完成前端加密
敏感数据在离开浏览器前就应进行加密保护。在JSP页面中,我们可以借助Struts2标签库,在表单提交时即时对敏感字段进行加密处理。下面是一个典型的前端加密示例,通过隐藏字段传递加密后的值。
这里的关键逻辑是:让用户输入明文数据,而标签通过%{encrypt(secretField)}表达式调用后端定义的加密方法,将加密后的结果作为一个隐藏字段随表单一起提交。这样一来,敏感数据在传输过程中就已经是密文,有效防止了中间人窃取。
第三步:通过拦截器在服务端解密
加密数据到达服务端后,不能直接用于业务处理。我们需要编写一个拦截器,在Action执行之前自动完成解密操作,并将解密后的明文放置到合适的位置供后续使用。这种方式既保持了代码的解耦,又确保了业务逻辑的纯净。
import com.opensymphony.xwork2.ActionInvocation;
import org.apache.struts2.interceptor.AbstractInterceptor;
import ja vax.servlet.http.HttpServletRequest;
import ja va.util.Map;
public class EncryptionInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession();
String encryptedSecretField = (String) session.get("encryptedSecretField");
String secretField = decrypt(encryptedSecretField);
session.put("secretField", secretField);
return invocation.invoke();
}
// 这里实现你自己的解密算法
private String decrypt(String encryptedValue) {
// ... 你的解密逻辑
return decryptedValue;
}
}
这个拦截器的作用非常清晰:从会话(Session)中获取前端提交的加密值,调用自定义的解密方法,然后将解密后的明文重新存入会话。之后,真正的业务Action就可以直接读取到可用的数据了。
第四步:在业务Action中使用解密后的数据
最后一步水到渠成。在你的业务Action中,直接从会话获取已经解密好的明文数据,或者通过其他机制(如值栈)拿到结果,然后进行后续的业务处理。以下是一个典型的Action实现示例。
import com.opensymphony.xwork2.ActionSupport;
import ja vax.servlet.http.HttpServletRequest;
import ja va.util.Map;
public class ProcessFormAction extends ActionSupport {
private String secretField;
// Getter and Setter
public String getSecretField() {
return secretField;
}
public void setSecretField(String secretField) {
this.secretField = secretField;
}
@Override
public String execute() {
// 此时secretField已经是解密后的明文,可以安全地用于业务逻辑
// ... 你的业务代码
return SUCCESS;
}
}
至此,一个完整的、基于Struts2 ActionForm的表单数据加密处理流程就顺利搭建完成了。当然,这只是一个基础示例,在实际项目中,加密算法的选择、密钥的安全管理、以及如何在Form、拦截器和Action之间更优雅地传递数据,都需要根据项目的具体安全要求和架构设计进行更细致的调整与优化。
