用Session防止表单重复提交

session防止表单提交的原理如图,就是将服务器端的编号和浏览器端的编号相比较。



我这个表单提交的原理是:
(1)通过一个servlet(a)访问到一个表单,在servlet跳转到表单之前,就在session作用域中生成一个tooken属性
          session.setAttribute("tooken", Math.random()+""); (随机数可能会重复,但不影响例子演示。)
(2)在表单页面中用一个hidden组件接收session作用域中的tooken属性
(3)表单提交到servlet(b)时,首先拿到表单中hidden组件中的tooken属性,再获取session作用域中的tooken属性,将两个进行对比,如果一样,则将session作用域中的tooken删除
session.removeAttribute("tooken");  
以下是具体代码:

Servlet   a

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.setAttribute("tooken", Math.random()+"");
		response.sendRedirect(request.getContextPath()+"/a.jsp");
}

a.jsp

<form action="${pageContext.request.contextPath}/servlet/b" method="post">
    	<input type="text" name="tooken" value="${tooken}">
    	<input type="submit" value="发送">
</form>
Servlet   b

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {//这里加入了延迟
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		String tooken = request.getParameter("tooken");
		String tooken_session = (String)request.getSession().getAttribute("tooken");
		System.out.println("request的tooken---------"+tooken);
		System.out.println("session的tooken---------"+tooken_session);
		if(tooken_session.equals(tooken)){
			request.getSession().removeAttribute("tooken");
		}//下面的代码是应该再跳转到servlet  a上,这样session中又重新获取了一个token,而不是直接跳转到a.jsp
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值