简单开发中重复提交的问题(令牌机制(一次性))

重复提交的问题:
* 添加完商品之后,转发到一个页面,刷新该页面.
* 网速很慢,点击提交的按钮,其实已经在提交了但是网速慢,不停的点击提交.

  • 解决重复提交的根本解决办法:令牌机制(一次性).
    • 生成随机的令牌保存在session中.
    • 在表单的提交的时候,将随机的令牌放入到表单的隐藏字段中.
    • 在Servlet中获得session中和表单中的令牌是否一致.
    • 如果一致执行插入操作,不一致跳转到其他页面.将令牌销毁.
package com.test.product.web.servlet;

import java.io.IOException;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.test.product.domain.Product;
import com.test.product.service.ProductService;
import com.test.utils.UUIDUtils;

/**
 * 添加商品的Servlet
 */
public class ProductAddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 接收参数:
		 * 封装数据:
		 * 调用业务层:
		 * 页面跳转:
		 */
		
		
		try{
			// 接收参数:
			request.setCharacterEncoding("UTF-8");
			// 判断是否是重复提交:
			String token1 = (String)request.getSession().getAttribute("token");
			String token2 = request.getParameter("token");
			// 清空session中的令牌:
			request.getSession().removeAttribute("token");
			if(!token2.equals(token1)){
				request.setAttribute("msg", "亲!您已经提交过!请不要重复提交了!");
				request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
				return;
			}
			Map<String,String[]> map = request.getParameterMap();
			// 封装数据:
			Product product = new Product();
			BeanUtils.populate(product, map);
			product.setPid(UUIDUtils.getUUID());
			product.setPdate(new Date());
			// 调用业务层:
			ProductService productService = new ProductService();
			productService.save(product);
			// 页面跳转:
			request.getRequestDispatcher("/ProductFindAllServlet").forward(request, response);
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

猜你喜欢

转载自blog.csdn.net/Marion158/article/details/87824856