Struts2页面刷新防重复表单提交:token标签报令牌参数未找到错误
解决Struts2 Token验证报错“Could not find token name in parameters.”
检查拦截器配置
确认login action是否正确配置了token拦截器。Struts2的token验证需要在action的拦截器栈中加入token(或tokenSession)拦截器,且需放在defaultStack之前:
<action name="login" class="your.package.LoginAction"> <interceptor-ref name="token"/> <interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result> <result name="invalid.token">/error.jsp</result> </action>
若使用tokenSession拦截器,替换上述token即可,它会在重复提交时返回上次请求结果而非直接报错。
确认表单渲染与提交参数
页面渲染后查看HTML源码,确认<s:token/>生成了两个隐藏字段:struts.token.name和对应token值。如果未生成,检查:
- JSP页面顶部是否正确引入Struts2标签库:
<%@ taglib prefix="s" uri="/struts-tags" %> - 表单
action属性是否与struts.xml中配置的action名称(含命名空间,若有)完全匹配
提交表单时,通过浏览器开发者工具确认struts.token.name和struts.token两个参数都被正常提交到服务器。
检查Struts2核心常量配置
确保struts.xml中未禁用token相关常量:
<!-- 默认值为true,不要设为false --> <constant name="struts.token.enabled" value="true"/> <!-- 不要随意修改token参数名,除非自定义了token标签的name属性 --> <constant name="struts.token.name" value="struts.token.name"/>
如果给<s:token>指定了自定义名称(如<s:token name="customToken"/>),需在拦截器配置中同步指定:
<interceptor-ref name="token"> <param name="tokenName">customToken</param> </interceptor-ref>
排除参数丢失或解析异常
- 检查是否有自定义拦截器过滤了表单参数,导致token相关参数被移除
- 确认action类继承了
ActionSupport,且未重写validate()方法导致参数解析异常
内容的提问来源于stack exchange,提问作者Rafael Souza
相关产品推荐
相关产品推荐

