javaweb银行转账,解决不刷新反复转账问题:
问题描述:一次转账请求过程中,在不刷新的情况下,出现可以重复转账的问题。
解决办法:令牌思想解决在一次转账请求中,出现多次重复转账问题。
解决思路:就是在每一次请求转账时,前端页面附加传入一个特殊标识(相当于令牌,每次请求转账就会随机生成一个标识)传入到servlet中,每次请求转账操作完成之后,servlet服务器中将特殊标识移除掉,也就意味着,如果前端页面在不刷新的情况下,也就是在同一次请求的情况下,前端传入的标识是不变得,而servlet服务器此时的标识已经移除掉了,此时,做一个判断,若前端的令牌和servlet中的令牌标识不相等,则拒绝再次转账,也就是不能重复转账。
做法: 定义一个令牌随机生成工具类,每次生成的标识,放入到session作用区域中
TokenUtils工具类:
public static String createToken(){
Long time = System.currentTimeMillis();
time = time+ new Random().nextInt(999999);
String tokenstr = String.valueOf(time);
return tokenstr;
}
public static void addToken(HttpServletRequest request,String token ){
request.getSession().setAttribute(token,createToken());
}
public static void remove(HttpServletRequest request,String token){
request.getSession().removeAttribute(token);
}
jsp页面中:
<%
TokenUtils.addToken(request,"token");
%>
servlet需要做的判断操作:
String token = request.getParameter("token");
String tokensess = (String) request.getSession().getAttribute("token");
if(StrUtils.strBlank(token)){
request.setAttribute("msg","令牌无效");
request.getRequestDispatcher("message.jsp").forward(request,response);
return;
}
if(!token.equals(tokensess)){
request.setAttribute("msg","不能重复转账");
request.getRequestDispatcher("message.jsp").forward(request,response);
return;
}
ts.sendmoney(money,fcard,tcard);
request.getSession().removeAttribute("token");
request.getRequestDispatcher("show.jsp").forward(request,response);
第一次: 第一次转账成功 接着,同一请求下,继续转账 结果显示:成功解决问题
|