struts2 的token机制在这里就不详细的描述了,大体上是:
在表单提交页面加上<s:token/>标签,在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏域如:
- <input type="hidden" name="struts.token.name" value="token"/>
- <input type="hidden" name="token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
- 并且将该GUID存放在session中,作为提交时的表示,防止重复提交。
- 以下是我的应用场景:
- 由于某些特殊的原因,我的一些表单数据需要通过ajax提交到后台,当struts的校验不通过时,我还需要将相应的错误信息显示到前台的jsp,具体请看下面的js脚本:
- 这是ajax请求成功后的处理方法,js脚本10-15需要重点关注。
- Core.ajaxSuccess = function(data) { if (data.actionErrors && data.actionErrors.length > 0) { $.each(data.actionErrors, function(name, value) { // $.messager.alert(value, 'error'); Core.errorAlert(value); }); return false; } if (!jQuery.isEmptyObject(data.fieldErrors)) { $("[id^='error_']").text(""); $.each(data.fieldErrors, function(name, value) { $("[id='error_" + name + "']").text(value); }); return false; } if (data.actionMeassages && data.actionMeassages.length > 0) { $.each(data.actionMeassages, function(name, value) { // $.messager.alert(value, 'error'); Core.successAlert(value); }); return true; } Core.successAlert(); return true;// 返回true表示响应中无错误信息 };
- 我的解决方案是,验证没有通过时,生成一个GUID返回到前台页面,存入 name="token" 的input中,这样再次请求时,就不会出现session中的GUID和页面请求的GUID不匹配的问题了!!!
- 以下是我的action处理代码:
@Override
public void validate() {
super.validate();
Map<String, List<String>> fieldErrors = this.getFieldErrors();
if ((fieldErrors != null) && !fieldErrors.isEmpty()) {
String struts_token = null;
if ((this.request != null) && (this.request.getSession() != null)
&& (this.request.getSession().getAttribute(TOKEN_SEESION_NAME) != null)) {
this.request.getSession().getAttribute(TOKEN_SEESION_NAME).toString();
}
if (StringUtils.isEmpty(struts_token)) {
struts_token = this.customTokenValue();//生成一个MD5串
this.request.getSession().setAttribute(TOKEN_SEESION_NAME, struts_token);
this.addFieldError("struts_token", struts_token);
}
}
}
1. if (!jQuery.isEmptyObject(data.fieldErrors)) {
$("[id^='error_']").text("");
$.each(data.fieldErrors, function(name, value) {
if (name == 'struts_token') {
$("[name='token']").val(value);
}
else {
$("[id='error_" + name + "']").text(value);
}
});
return false;
}
- 这里提供的是一种思路,通过struts标签生成的GUID需要重新加载页面才能生效,当这种机制行不通的时候,我们需要另辟蹊径处理token相关的问题了;这里说的是struts验证不通过的问题,可能你还会遇到别的类似的问题,一样的找到你的GUID存放位置,重新设置GUID值,传值到前台,解决该问题。。。