1、可以利用JavaScript 来做判断当用户点击了就禁用按钮或者是删除按钮的点击事件,但是这样做治标不治本。
2、利用token来实现防止重复提交的操作,这种做法是最常用的也是最简便的。
具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
逻辑操作代码:
if(payload_params.containsKey("token")&&payload_params.getString("token")!=null&&!"".equals(payload_params.getString("token"))){ String client_token =payload_params.getString("token"); if(!isRepeatSubmit(request,client_token)){ WsrzCheckRzService.getRzResultForCheckRz(request, conn, responseJson, courseId,
practiceId, true); boolean effo = this.reomveSaveTokenInSession(request);//清除session中保存认证的token responseJson.put(PropKeys.RES_CODE, PropKeys.CODE_SUCCESS); }else{ log().info("用户重复提交"); responseJson.put(PropKeys.RES_MSG, "请不要重复提交"); }}else{ log().info("未传入保存token"); responseJson.put(PropKeys.RES_MSG, PropKeys.CODE_ERROR_MSG);}
操作Session基本方法:
/** * @Author liwt * @Description //创建保存网上认证 token 到session中 * @Date 2019/1/17 14:36 * @param request * @throws * @return 生成的token */private String createSaveTokenToSession(HttpServletRequest request){ // 生成token令牌 返回给wsrz_invoice_rz_result.jsp 在保存时做防止重复提交。 String token = DateUtils.getUniqueID(); log().info("保存网上认证Token:"+token); request.getSession().setAttribute("save_wsrz_token", token); //在服务器使用session保存token(令牌) return token;}private boolean reomveSaveTokenInSession(HttpServletRequest request){ Object obj = request.getSession().getAttribute("save_wsrz_token"); if(obj!=null){ request.getSession().removeAttribute("save_wsrz_token");//移除session中的token return true; }else{ return false; }}/** * @Author liwt * @Description //判断客户端提交上来的令牌和服务器端生成的令牌是否一致 * @Date 2019/1/17 10:23 * @param request * @throws * @return boolean * true 用户重复提交了表单 * false 用户没有重复提交表单 */private boolean isRepeatSubmit(HttpServletRequest request,String client_token) { //取出存储在Session中的token Object obj = request.getSession().getAttribute("save_wsrz_token"); //2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单 if(obj==null){ return true; } String server_token = String.valueOf(obj); //3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单 if(client_token.equals(server_token)){ return false; }else{ return true; } }