Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止后退按钮在Javaservlet中重新提交表单数据_Java_Eclipse_Jsp_Tomcat_Servlets - Fatal编程技术网

防止后退按钮在Javaservlet中重新提交表单数据

防止后退按钮在Javaservlet中重新提交表单数据,java,eclipse,jsp,tomcat,servlets,Java,Eclipse,Jsp,Tomcat,Servlets,提交表单后,用户单击“上一步”按钮,如何防止重新提交数据。我读到的很多东西表明,解决这个问题的方法是实现PRG“模式” 我找到了这个我想用作示例的网页 当我执行这段代码时,我仍然可以单击“上一步”按钮,然后重新单击“提交”按钮,让表单重新提交数据,即使它重定向。因此,我不认为这会阻止重新提交表单数据 因此,以此页面为例,如何修改代码以防止此行为?PRG用于防止重新加载重新提交事件,您始终可以从浏览器返回页面并使用此 为了防止这种情况,您可以在呈现表单和提交表单时发出令牌,并将其发送到服务器,查看

提交表单后,用户单击“上一步”按钮,如何防止重新提交数据。我读到的很多东西表明,解决这个问题的方法是实现PRG“模式”

我找到了这个我想用作示例的网页

当我执行这段代码时,我仍然可以单击“上一步”按钮,然后重新单击“提交”按钮,让表单重新提交数据,即使它重定向。因此,我不认为这会阻止重新提交表单数据


因此,以此页面为例,如何修改代码以防止此行为?

PRG用于防止重新加载重新提交事件,您始终可以从浏览器返回页面并使用此

为了防止这种情况,您可以在呈现表单和提交表单时发出令牌,并将其发送到服务器,查看该令牌是否正确(通过将其放置在会话中的某个位置),然后处理请求

更新:当您提供表单时,请在会话中设置一些令牌

request.getSession().setAttribute("formToken", someCode);
现在在提交表单时,将令牌发回服务器,并将其与会话中的令牌进行匹配,如果两个匹配都允许请求,如果不匹配,则表示请求已经执行,或者有人试图模拟表单post,并且在提交的数据中缺少表单令牌

所以现在,如果您已经提交了一次,并且如果您使用浏览器按钮返回并再次提交,代码将不匹配,这将阻止重新提交


使令牌检查同步以处理并行请求。如果PRG用于防止重新加载重新提交事件,则您始终可以从浏览器返回页面并提交表单

为了防止这种情况,您可以在呈现表单和提交表单时发出令牌,并将其发送到服务器,查看该令牌是否正确(通过将其放置在会话中的某个位置),然后处理请求

更新:当您提供表单时,请在会话中设置一些令牌

request.getSession().setAttribute("formToken", someCode);
现在在提交表单时,将令牌发回服务器,并将其与会话中的令牌进行匹配,如果两个匹配都允许请求,如果不匹配,则表示请求已经执行,或者有人试图模拟表单post,并且在提交的数据中缺少表单令牌

所以现在,如果您已经提交了一次,并且如果您使用浏览器按钮返回并再次提交,代码将不匹配,这将阻止重新提交


使令牌检查同步以处理并行请求案例

“通过将其放在会话中的某个位置”如果您能以我链接到的页面上的代码为例描述如何执行该操作,将对我非常有帮助。您不必获取代码并运行它,只需描述流程即可……:)我想我有点糊涂了。但是,如果我在doGet(提供表单)中使用上面的代码片段,然后在doPost中匹配它,它们将始终匹配,因为当我单击“上一步”按钮时,将执行doGet,这将设置属性…如果浏览器没有缓存页面,它将执行doGet,否则,通过这种方式,您可以检测用户是否已提交表单,然后不再为该用户呈现表单,也不为该用户接受任何处理该表单的请求非常感谢您的帮助。“通过将其放置在会话中的某个位置”如果您能以我链接的页面上的代码为例来描述如何做到这一点,那将对我非常有帮助。您不必获取代码并运行它,只需描述流程即可……:)我想我有点糊涂了。但是,如果我在doGet(提供表单)中使用上面的代码片段,然后在doPost中匹配它,它们将始终匹配,因为当我单击“上一步”按钮时,将执行doGet,这将设置属性…如果浏览器没有缓存页面,它将执行doGet,否则,通过这种方式,您可以检测用户是否已提交表单,然后不再为该用户呈现表单,也不为该用户接受任何处理该表单的请求非常感谢您的帮助。