重复提交的问题:
* 添加完商品之后,转发到一个页面,刷新该页面.
* 网速很慢,点击提交的按钮,其实已经在提交了但是网速慢,不停的点击提交.
- 解决重复提交的根本解决办法:令牌机制(一次性).
- 生成随机的令牌保存在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);
}
}