struts2的token令牌
1、javaweb控制表单重复提交
(1)在jsp页面上使用隐藏域<input type="hidden" name="token.html" value="1sdfsdfsdfsdfsdfsdfsdf">
这样做,每次正常跳转到该页面隐藏域都会产生不同的value的值,此时属于正常操作
如果提交表单的时候,出现隐藏域的值相同,说明表单重复提交
(2)在Action类中
先获取session中存放的token的值,String sessionToken = session.getAttibuter("sessionToken");
首先会获取页面表单隐藏域(token.html)的值,String token = request.getParameter("token.html");
同时放置到session中,session.setAttibuter("sessionToken",token);
判断表单是否重复提交
if(sessionToken.equal(token)){//表单重复提交
}
else{//表单没有重复提交
}
2、struts实现表单重复提交
(1)在某个页面验证表单重复提交,此时要添加<s:token>标签,该标签可以产生如下代码:
<!--
s:token用来判断表单是否重复提交的标签,这个标签会产生如下代码
<input type="hidden" name="struts.token.name" value="struts.token" />
<input type="hidden" name="struts.token" value="FDHJG5ZGWNCY5XOR9DG5O0HT0NPM7DMI"/>
-->
<s:token/>
(2)由于token拦截器没有放置到默认栈中,所以当使用token表单重复提交的时候,需要在struts.xml中加载token拦截器
<!-- 重新加载拦截器,添加token拦截器 -->
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="token"></interceptor-ref>
<!-- 在token拦截器的后面加载默认栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
(3)需要在指定的Action的配置文件struts.xml中,使用invalid.token返回到对应的错误页面
<!-- 验证表单重复提交的时候,需要添加invalid.token返回值,使用该值跳转到错误的页面 -->
<result name="invalid.token">/model/message.jsp</result>
(4)如果加载表单重复提交的拦截器,那么此时对访问当前Action中所有的方法都进行拦截器,
我们希望对Action中某个方法进行表单重复提交的校验,此时,添加includeMethods参数定义:
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="token">
<!--
includeMethods:表示只针对某个方法进行表单重复提交的校验,而不是所有的方法,
如果要对当前Action多个方法进行校验,此时可以用逗号分开
-->
<param name="includeMethods">save</param>
</interceptor-ref>
<!-- 在token拦截器的后面加载默认栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
(5)在错误页面显示表单重复提交的错误信息,错误信息通过标签s:actionerror显示
<!-- 使用s:actionerror标签用来显示表单重复提交的错误信息 -->
<s:actionerror/><br>
(6)实现国际化,将表单重复提交改成中文
struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.
转载于:https://blog.51cto.com/xiaoliha/1214995