struts2 的token机制在这里就不详细的描述了,大体上是:

       在表单提交页面加上<s:token/>标签,在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏域如:



  1. <input type="hidden" name="struts.token.name" value="token"/>  
  2. <input type="hidden" name="token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
  3.        并且将该GUID存放在session中,作为提交时的表示,防止重复提交。
  4. 以下是我的应用场景:
  5.        由于某些特殊的原因,我的一些表单数据需要通过ajax提交到后台,当struts的校验不通过时,我还需要将相应的错误信息显示到前台的jsp,具体请看下面的js脚本:
  6.        这是ajax请求成功后的处理方法,js脚本10-15需要重点关注。
  7. 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表示响应中无错误信息 };
  8.        我的解决方案是,验证没有通过时,生成一个GUID返回到前台页面,存入 name="token" 的input中,这样再次请求时,就不会出现session中的GUID和页面请求的GUID不匹配的问题了!!!
  9.        以下是我的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;
	}
  1.         这里提供的是一种思路,通过struts标签生成的GUID需要重新加载页面才能生效,当这种机制行不通的时候,我们需要另辟蹊径处理token相关的问题了;这里说的是struts验证不通过的问题,可能你还会遇到别的类似的问题,一样的找到你的GUID存放位置,重新设置GUID值,传值到前台,解决该问题。。。