Java-web放重复提交、动态验证码
一、项目中可能产生重复提交的情况:
1,由于服务器缓慢或网络延迟的原因,重复点击提交按钮.
2,已经提交成功,刷新成功页面(forward).
3,已经提交成功,通过回退,再次点击提交按钮.
注意:
1,回退后,刷新表单页面,再次提交这时不是重复提交,而是发送新的请求
2,在Firefox下,重复提交到同一地址无效
二、解决表单重复提交方案:
1、方案一,利用javaScript:
解决了反复点击按钮的重复提交请求,但是没有解决刷新页面重复提交.
var flag=false;function save(){ if(!flag){ document.forms[0].submit(); flag=true; }else{ alert("您已经提交了页面"); } }package cn.itcast.cd.util;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang3.StringUtils;public class TokenUtil {public static void getToken(HttpServletRequest request) {String randomValue = UUID.randomUUID().toString(); // 往session中值String randomName = UUID.randomUUID().toString();// 往session中名字request.setAttribute("randomValue", randomValue);request.setAttribute("randomName", randomName);request.getSession().setAttribute(randomName, randomValue);}/** * 请求表单中的随机数和session中的随机数对应上 return true * * @param request * @return */public static Boolean validate(HttpServletRequest request) {// 得到页面上传递过来的..String randomValue = request.getParameter("randomValue");String randomName = request.getParameter("randomName");// 得到session中的String randomValueInSesson = (String) request.getSession().getAttribute(randomName);return StringUtils.isNotBlank(randomValueInSesson)&& StringUtils.isNotBlank(randomValue)&& randomValue.equals(randomValueInSesson);}public static void resetToken(HttpServletRequest request) {String randomName = request.getParameter("randomName");request.getSession().removeAttribute(randomName);}}package cn.itcast.cd.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;public class LoginServlet extends HttpServlet {/** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse * response) */protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String code = request.getParameter("code");String randomCode = (String) request.getSession().getAttribute("randomCode");if (StringUtils.equalsIgnoreCase(code, randomCode)) {System.out.println("执行正常的业务逻辑");} else {request.setAttribute("error", "验证码出错");request.getRequestDispatcher("/login.jsp").forward(request,response);}}}package cn.itcast.cd.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import java.util.UUID;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class RandomCodeServlet */public class RandomCodeServlet extends HttpServlet {protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {String randomCode = (UUID.randomUUID().toString()).substring(0, 4);request.getSession().setAttribute("randomCode", randomCode);response.setContentType("image/jpeg"); // 因为向客户端发送的内容是图片. 所以用这种内容类型int width = 100;int height = 50;// >>1.创建一个图片对象BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);// >>2.得到画布Graphics graphics = image.getGraphics();// >>3.开始在图片上画画// >>3.1 用白色填充. 首先要设置上下文的颜色graphics.setColor(Color.white);// 设置白色graphics.fillRect(1, 1, width - 2, height - 2);// >>3.2 用黑色写文字graphics.setColor(Color.black);graphics.setFont(new Font("宋体", Font.BOLD, 30));graphics.drawString(randomCode, width / 6, height / 2 + 5);// >>3.3 画混淆内容graphics.setColor(Color.red);for (int i = 0; i < 50; i++) {graphics.fillOval(new Random().nextInt(width),new Random().nextInt(height), 3, 3);}for (int i = 0; i < 10; i++) {graphics.setColor(new Color[] { Color.red, Color.blue, Color.GRAY }[new Random().nextInt(3)]);graphics.drawLine(new Random().nextInt(width),new Random().nextInt(height), new Random().nextInt(width),new Random().nextInt(height));}// >>4.关闭画布,释放资源...graphics.dispose();// 输出图片ImageIO.write(image, "JPG", response.getOutputStream());}}<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript">function changeImage() {document.getElementById("randomCode").src = "/randomCode?"+ Math.random();解决点击验证码没有反应问题}</script></head><body><form action="/login" method="post">用户名:<input name="username" type="text"><br /> 密码:<inputname="password" type="password"><br /> 验证码:<input name="code"type="text"><img alt="Java-web置重复提交、动态验证码" src="/randomCode" id="randomCode"style="cursor: pointer;" onclick="changeImage()"> ${error}<br /><input type="submit" value="登录"></form></body></html>