Token解决页面刷新重定向

由于本人通过url带参数转页面过程中发现:刷新的时候页面会重新实现这个过程,因此页面效果展示及实现受到了影响。经过网上查阅相关知识,发现可以用Token来解决这个问题。
上网查了一下,token是被称为“令牌”的一种身份验证方式,可以解决表单提交、页面刷新等问题,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。
解决思路:
要想从a页面跳到b页面,保证b页面刷新时不会被重复提交且页面返回到a重复跳到b页面不会重复提交

  1. 在进入a页面前,先在session里面存入一个token,并在request请求中存入token
  2. 在a页面中,将request中的token放在表单隐藏域中或者url中
  3. 拦截a到b的url请求时,先拿到session中的sToken和url中的token,如果sToken存在并且跟token一致则表明是第一次跳转至b页面,此时把跳转到b页面和b页面需要的参数存进session
  4. 如何sToken不存在则表明页面出错或者被关闭,如果sToken跟token不一致则表明页面是重复刷新,F5或者返回上一级再进来都有可能,这时可以从session中拿到之前存进来的数据,再次跳转到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:新人写博客,有问题请多多指出。

你可能感兴趣的:(刷新重复提交)