今天讲的主要是:利用Session防止表单重复提交
首先你可以创建一个html表单;用script
<script type="text/javascript" >
var iscommited = false;
function checkPost(){
if(!iscommited){
iscommited = true;
return true;
}else{
return false;
}
}
</script>
</head>
<body>
<form action="/book/FormServlet" method="post" onsubmit = "return checkPost()">
用户名: <input type="text" name="name" />
<br>
<input type="submit" value="提交" />
</form>
</body>
创建一个servlet类,如果注册成功就跳转,
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("注册成功 ");
System.out.println("正在向服务器发送。。。。。");
}
但是这种情况有缺陷,用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交;
为了防止表单重复提交,使用随机标识符
表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求:
存储Session域中的表单标识号与表单提交的标识号不同
当前用户的Session中不存在表单标识号
用户提交的表单数据中没有标识号字段
首先创建一个隐藏java类;获取随机标识符
public class TokenDemo {
private TokenDemo(){
}
private static final TokenDemo token = new TokenDemo();
public static TokenDemo getToken(){
return token;
}
public String generateToken(){
int i = new Random().nextInt();
String value = System.currentTimeMillis()+i+"";
try {
MessageDigest md= MessageDigest.getInstance("md5");
byte[] bt = md.digest(value.getBytes());
BASE64Encoder base = new BASE64Encoder();
return base.encode(bt);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException();
}
}
}
//创建一个表单号:
public class FormGenerateServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
TokenDemo td=TokenDemo.getToken();
String token = td.generateToken();
request.getSession().setAttribute("token", token);
out.print("<form action='/book/FormDealServlet' method='post'>");
out.print("<input type='hidden' name='token' value='"+token+"' />");
out.print("用户名:<input type='text' name='name' /> <br />");
out.print("<input type='submit' value='提交' />");
out.print("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
//判断标识符是否相同
public class FormDealServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
boolean b = isTokenValidate(request);
if(!b){
System.out.println("请不要重复");
return;
}
request.getSession().removeAttribute("token");
System.out.println("向服务器注册信息");
}
private boolean isTokenValidate(HttpServletRequest request){
String name =request.getParameter("token");
if(name==null){
return false;
}
String server_token = (String) request.getSession().getAttribute("token");
if(server_token==null){
return false;
}
if(!name.equals(server_token)){
return false;
}
return true;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}