我们有一个基于Java的Web应用程序,在企业环境中运行,用户在代理后面。 Web应用程序在同一台服务器上安装了tomcat,其中apache Web服务器位于前端。另请注意,我们限制了对整体环境的访问,因此解决方案是在猜测工作中实施的。但是我们可以访问应用服务器。
我们在应用程序中有一个网页,允许用户上传文件,处理文件并创建日志文件。这些文件需要一些时间来处理,有时甚至高达10-20分钟。创建的日志文件的名称附加了时间戳。每次加载网页时都会生成此日志文件的时间戳。日志文件名也显示在网页上的文本框字段中,并显示其当前值(例如log_2017-02-19 01.18.24.html)。因此,用户始终可以看到它。
我们遇到的最初问题是生成了重复请求,因此用户提交的同一文件被多次处理。用户确认他们没有多次提交相同的请求。
我们首先实现了一个基于ajax / javascript的解决方案,以便在提交文件时删除回发/页面刷新。我们还在提交文件时使用javascript隐藏提交按钮,以确保用户不会错误地重新提交请求。 ajax / js解决方案使用POST方法,并在收到服务器的响应后,在29秒的间隔后重新加载页面。
查看应用程序http日志,我们发现创建的日志文件与重复请求具有完全相同的时间戳值。然后我们认为是代理人在没有用户知道的情况下发送重复请求,假设上游服务器超时。我们保留了基于ajax的解决方案,但现在引入了一个tomcat过滤器来拦截post请求。我们查找传入的日志文件名请求参数,并在发现重复的情况下阻止它。这阻止了代理生成的重复项。
现在我们遇到了相同的重复文件处理问题,但这次生成的日志文件没有完全相同的时间戳。以下是一个场景。
用户再次确认他们没有提交重复请求。 Web应用程序中是否有人观察到此行为?即使在页面重新加载后,它是否可以自动触发ajax或javascript?或者也许提交按钮的onclick处理程序会自动启动?
请问?