关于form页面刷新重复提交的解决方法

我们平时开发免不了要提交form但是每次页面刷新都会提交一次form这让人很头痛 下面就分享一个简单的解决方法

import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class TokenGen {
        private static TokenGen instance = new TokenGen();
    
        private TokenGen() {}
    
        public static TokenGen getInstance() {
            return instance;
        }
    
        public synchronized boolean isTokenValid(HttpServletRequest request) {
            // 没有session,判为非法
            HttpSession session = request.getSession(false);
            if (session == null)
                return false;
    
            // session中不含token,
            // 说明form被提交过后执行了resetToken()清除了token
            // 判为非法
            String stoken = (String) session.getAttribute("token");
            if (stoken == null)
                return false;
    
            // request请求参数中不含token,
            // 判为非法
            String rtoken = request.getParameter("token");
            if (rtoken == null)
                return false;
    
            // request请求中的token与session中保存的token不等,判为非法
            return stoken.equals(rtoken);
        }
         
        /*
         * 重新设置token,当页面被请求后,将session中的token属性去除
         */
        public synchronized void resetToken(HttpServletRequest request)
        {
            HttpSession session = request.getSession(false);
            if (session!=null)
            {
                session.removeAttribute("token");
            }
        }
        /*
         * 为请求新建一个token标记,此标记由一个随机的double数toString形成,并把字符值存入session中
         */
         
        public synchronized void saveToken(HttpServletRequest request)
        {
            HttpSession session = request.getSession(true);
            Random rand = new Random();
            Double d = rand.nextDouble();
            session.setAttribute("token", d.toString());   
        }
    }

然后需要在提交form的jsp页面进行调用

<%@ page language="java" import="java.util.*,com.test.tools.TokenGen" pageEncoding="UTF-8"%>

注意要引入这个类

 <%
  TokenGen.getInstance().saveToken(request);
  String s = (String)session.getAttribute("token");
 %>

接下来我们把类产生的也可以说是校验码s跟随form一并提交(方式就类似与登录时候随机生成的验证码一样)

<form action=xxxx.do?a=test" method="post">
                 <input type="hidden" name="token" value="<%=s%>"/>

</form>

然后我们就在action里面进行验证这个form是不是提交过 如果提交过我们就给出相应提示

TokenGen tokenGen=TokenGen.getInstance();
          if (!tokenGen.isTokenValid(request)){
              return  验证失败给出提示
          }else{
         tokenGen.resetToken(request);  说明没有重复提交 这里就把数据保存 然后把校验码清空 否则下次form无法验证通过

     ....数据提交代码

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值