页面刷新重新提交上一次请求解决方法

前言:公司里面有一个项目,前端是用JSP编写的,并且还是使用的Struts框架。用的技术可以说是非常老了。

话不多说,先简单介绍一下我遇到的问题所在。页面上有一个文件导出的按钮,当执行文件导出功能后,页面上会出现一个弹窗,显示文件导出成功或者导出失败等提示信息。功能使没有问题的,但是执行导出后你鼠标右键点击刷新页面,会又执行一次文件导出。这就出现问题了,页面刷新会重复提交上一次请求。

网上搜索了一下,大多数人所提供的方法都是使用重定向了,ajax了,令牌了之类等等,但就只是简单的介绍,他们说的方法确实是没有问题的,但有时候需要结合项目本身,找出一个适合的方法。

首先来说一下,为什么页面提交会执行上一次请求。浏览器向服务端发送请求的时候,会默认将上一次请求存储在浏览器中,刷新页面,浏览器会和服务器发生一次交互,这个时候就会将上一次请求重新执行一遍。

很多人不明白,为什么刷新页面,就要重新把上一次请求再执行一遍。不执行行不行。你想啊,刷新页面,意味着浏览器和服务器要发生一次交互。但是如果浏览器什么都不做,那怎么和服务器交互呢。连显示页面都不可能。

解决方法:
在页面刚一加载的时候,将浏览器中存储的上一次请求给替换掉。

$(function () {
    if(window.history.replaceState)
    {
         window.history.replaceState(null, null, window.location.href)
    }

})

window.history.replaceState这个方法的作用就是把当前的页面的历史记录替换掉, 但不会刷新网页本来历史记录是之前的POST请求提交的操作, 替换后变为当前的页面网址。我们只需要在页面载入的时候执行这一句即可。

有时候这种方式可能也会出现一点小问题,我们可以打开F12,刷新页面,看看浏览器发送的请求是不是我们想要发送的地址。如果不是,那么我们可以将window.location.href修改为具体的url地址。

$(function () {
    if(window.history.replaceState)
    {
        window.history.replaceState(null, null, '具体要替换的地址')
    }

})

加上上述操作之后,再执行生成文件功能,点击刷新后,页面不会重复提交。

你可能感兴趣的:(疑难杂症,js,JSP)