向后台传送数据。那么可能就会有一些捣乱的用户,或者恶意工具做事器的
他可能多次点击提交按钮。导致做事器须要解析多次要求
那么就会涌现问题。增加做事器压力。
办理方案1:
通过js ,定义一个全局变量。默认是false,当用户点击提交按钮。把全局变量该为true.
当用户点击第二次提交,会如果是true就不再实行提交。
代码如下
<script type=\公众text/javascript\"大众>
var isCommitted = false;//表单是否已经提交标识,默认为false
function dosubmit(){
if(isCommitted==false){
isCommitted = true;//提交表单后,将表单是否已经提交标识设置为true
return true;//返回true让表单正常提交
} else {
layer.msg(\公众您已经提交过了,信息正在查询请您耐心等待..\"大众)
return false;//返回false那么表单将不提交
}
}
</script>
其次须要在表单onsubmit=\"大众return dosubmit()\"大众
用户点击提交之后默认转到该方法下实行代码
以上一种办理方案,只能办理不懂技能的,小白用户 但是不能从根本上办理问题
还有一种办法 便是 在做事器做验证。这也是最佳的办理方案 (推举利用这种办法)
这种办理方案大略概括便是:
用户点击跳珠表单页面,会默认天生一个token值。token值可以是uuid+算法天生的唯一值。办法多种多样都可以
然后把这个token值放入session中,后台可以通过el表达式把通过key拿出token值,存入form表单中的hidden隐蔽表单中
用户每次提交,连同表单数据和这个token值发送到做事器。做事器去校验这个token值。
首先校验这个token值你要知道有几种情形
第一种:
表单中没有token,代表他重复叫
第二种
当前session中没有token,则用户代表重复提交
第三种
存储在session中的token令牌与表单Token不同,则代表用户重复提交
每种情形都要考虑进去,
直接干代码!
!
不说废话了
上面几种情形 我会单独 写出一个工具类
/
判断客户端提交上来的令牌和做事器端天生的令牌是否同等
@param args
true:表示重复提交
false:表示没有重复提交
/
public static boolean isRepeatSubmit(HttpServletRequest request) {
String client_token = request.getParameter(\"大众token\"大众);
//第一种情形,如果提交表单没有token则该用户是重复提交表单
if (client_token == null){
return true;
}
//取出来存储在session中的令牌
String server_token = (String) request.getSession().getAttribute(\公众token\公众);
//2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单
if (server_token == null){
return true;
}
//3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单
if (!client_token.equals(server_token)){
return true;
}
return false;
}
2 跳转页面对盆token值
//该方法紧张用于跳转JSP页面,并且防止多次提交创建token
@RequestMapping(value = \"大众findLogisticsPrice\公众)
public String findLogistics(HttpServletRequest request, HttpServletResponse response){
String token = TokenUtils.getAccessToken(UUID.randomUUID().toString());
request.getSession().setAttribute(\公众token\"大众, token);
return \"大众modules/logisticsproviders/freightEstimateIndex\公众;
}
天生token值的代码为:
/
描述:天生Token方法
@return
/
public static String getAccessToken(String uuid){
String key = \公众UZ\公众;
String timestamp = String.valueOf(System.currentTimeMillis());
return HMACSHA256((uuid+timestamp).getBytes(),key.getBytes());
}
3 在业务层直接处理逻辑
//判断用户是否是重复提交
boolean b = TokenUtils.isRepeatSubmit(request);
if (b==true){
String ze = \公众请不要重复提交!
!
!
\"大众;
return ze;
}
当业务层逻辑快实行完时候
//移除session中的token
request.getSession().removeAttribute(\"大众token\"大众);