【发布时间】:2018-07-21 11:30:58
【问题描述】:
请考虑这种情况:用户应该向服务器发送一些文件,并且每个用户都有一个 id。每个用户必须发送一次文件,而不是两次。如果用户发送文件并且他想再次发送,文件上传页面将不会显示给他。但是有一个问题:上传过程需要时间,上传文件时,用户可以刷新页面,页面显示给他(因为文件还没有上传),然后他可以一次又一次地上传文件! 使用 jsp 的客户端代码,我无法更改它。现在我想防止在服务器端刷新页面。为此,我使用了一个中间页面:当用户想要查看文件上传页面时,他会转到这个中间页面(servlet),这个中间 servlet 会在用户的会话中放置一个标志并将他重定向到文件上传 servlet。文件上传 servlet 检查标志,如果存在,则向他显示页面,然后将删除标志。每当用户尝试刷新文件上传页面时,该标志不存在,他将被重定向到错误页面。 这是我的解决方案,但它有一个严重的问题:当用户从中间 servlet 重定向到文件上传 servlet 时,它的请求和响应将被破坏,我无法访问他的请求(用户通过他的请求向我发送一些信息,我需要文件上传 servlet 中的那些)。
1 - 有没有办法克隆请求对象? (这样我就可以进入会话并在重定向之后,我可以检索它)
2- 如果答案是否定的,我的问题是否有更好的解决方案?
任何建议将不胜感激。
编辑: 请注意,我不想将请求参数/属性保存到会话中。
【问题讨论】:
-
我认为在上传 servlet(或服务)中包含验证会更有凝聚力。如果文件已保存,则会引发异常。注意:因为 Servlet 不是线程安全的,所以要同步执行验证的块。另一个技巧是使用特定的异常,然后在 web.xml 中将其定义到 Container 转发到特定的错误页面。
-
@HenriqueFernandesCipriano:这是正确的方法,但不幸的是,我使用引擎进行文件存储及其处理,引擎会延迟几秒钟来获取文件,然后,我可以执行这样的操作验证。感谢您的有用回复