java http重复提交_JavaWeb_HttpSession之表单的重复提交

表单的重复提交

1)重复提交的情况

1>在表单提交到一个Servlet,而Servlet又通过请求转发的方式响应了一个JSP(HTML)页面,此时地址栏还保留着Servlet的那个路径,在响应页面点击“刷新”。

2>在响应页面没有到达时重复点击“提交按钮”

3>点击“返回”,再点击“提交”

2)不是重复提交的情况

1>点击“返回”,“刷新”原表单页面,再“提交”

3)如何避免表单的重复提交

1>在表单中做一个标记,提交到Servlet时,检查标记是否存在且是否和预定义的标记一致,若一致,则受理请求,并销毁标记,若不一致或没有标记,则直接响应提示信息:“重复提交”

(1)仅提供一个隐藏域:行不通:没有办法清除固定的请求参数。

(2)把标记放在request中,行不通,因为表单页面刷新后,request已经被销毁,再提交表单是一个新的request。

(3)把标记放在session中,可以!

>在原表单页面,生成一个随机值token

>在原表单页面,把token值放入session属性中

>在原表单页面,把token值放入隐藏域中。

——提交表单

>在目标的servlet中:获取session和隐藏域中的token值

>比较两个值是否一致:若一致,受理请求,且把session域中的token属性清除

>若不一致,则直接响应提示页面:"重复提交"

原理:在原表单页面,创建一个session属性,和隐藏域,两个值开始时是一个相同的随机值,当进入servlet中比较两个值是否相同,相同删除session属性。

login.jsp

ab4ecfedb54d1d1df6c44daa6beab981.png

单击提交表单

a9f2cbab0e4d62b95ee4c414d670d565.png

点击返回,点击提交表单。

8f3874b51142f7b2ba6aa48a01a3a36c.png

刷新原表单页面,连续点击提交

191212863c4f39d052248848781009f9.png

源码:

login.jsp

Created by IntelliJ IDEA.

User: dell

Date: 2019/7/11

Time: 16:05

To change this template use File | Settings | File Templates.

--%>

Title

String tokenValue = new Date().getTime() + "";

session.setAttribute("token",tokenValue);

%>

name:

tokenservlet

package com.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

public class TokenServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

HttpSession session = req.getSession();

Object token = session.getAttribute("token");

String tokenValue = req.getParameter("token");

System.out.println(token);

System.out.println(tokenValue);

if (token!=null&&token.equals(tokenValue)){

session.removeAttribute("token");

}else{

resp.sendRedirect(req.getContextPath()+"/stoken/error.jsp");

return;

}

String name = req.getParameter("name");

System.out.println("name: " +name);

resp.sendRedirect(req.getContextPath()+"/stoken/success.jsp");

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值