由于本人通过url带参数转页面过程中发现:刷新的时候页面会重新实现这个过程,因此页面效果展示及实现受到了影响。经过网上查阅相关知识,发现可以用Token来解决这个问题。
上网查了一下,token是被称为“令牌”的一种身份验证方式,可以解决表单提交、页面刷新等问题,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。
解决思路:
要想从a页面跳到b页面,保证b页面刷新时不会被重复提交且页面返回到a重复跳到b页面不会重复提交
跳转到a之前存Session:
String token = UUID.randomUUID().toString();
req.getSession().setAttribute("token", token);
req.setAttribute("token", token);
```a页面防止request中的token
location.href="${pageContext.request.contextPath}/browser/seeOrder?aId="+aId+"&commodityIds="+commodityIds
+"&numss="+nums+"&userId=<%=userId%>"+"&token=<%=request.getAttribute("token")%>";
第一次跳转到b页面的逻辑
String stoken =(String) req.getSession().getAttribute("token");
if(token!=null && token.equals(stoken)){
model.addAttribute("date",date);
model.addAttribute("express",exp);
model.addAttribute("coms",set);
model.addAttribute("num",count);
model.addAttribute("price",price);
model.addAttribute("address",address);
model.addAttribute("randomOrderId",randomOrderId);
req.getSession().setAttribute("aId", aId);
req.getSession().setAttribute("date", date);
req.getSession().setAttribute("express",exp);
req.getSession().setAttribute("coms",set);
req.getSession().setAttribute("num",count);
req.getSession().setAttribute("price",price);
req.getSession().setAttribute("address",address);
req.getSession().setAttribute("randomOrderId",randomOrderId);
req.getSession().setAttribute("countNum",countNum);
req.getSession().removeAttribute("token");
return "browser/seeOrder";
}
重复跳转时
else{
aId=(int) req.getSession().getAttribute("aId");
date=(String) req.getSession().getAttribute("date");
exp=(String) req.getSession().getAttribute("express");
set=(Set>) req.getSession().getAttribute("coms");
count=(int) req.getSession().getAttribute("num");
price=(int) req.getSession().getAttribute("price");
address=(Address) req.getSession().getAttribute("address");
randomOrderId=(int) req.getSession().getAttribute("randomOrderId");
countNum=(int)req.getSession().getAttribute("countNum");
model.addAttribute("aId",aId);
model.addAttribute("date",date);
model.addAttribute("randomOrderId",randomOrderId);
model.addAttribute("express",exp);
model.addAttribute("coms",set);
model.addAttribute("num",count);
model.addAttribute("price",price);
model.addAttribute("address",address);
model.addAttribute("userId",userId);
model.addAttribute("commodityIds",commodityIds);
model.addAttribute("numss",numss);
countNum++;
req.getSession().setAttribute("countNum", countNum);
System.out.println("重复刷新了提交订单页面"+countNum+"次");
return "browser/seeOrder";
}
当第一次跳转进b页面时,生成一个随机数并在页面展示,如果不将这个随机数存进session,F5刷新或者返回上一级再进跳转都会改变这个随机数。因此,想要拿到原来的数据可以选择存进session再拿取。
ps:新人写博客,有问题请多多指出。