刷新时如何避免重新提交jsp?

时间:2009-08-23 01:17:03

标签: jsp refresh submit

我正在写一个程序,但我遇到了一个问题: 当我刷新jsp页面时,系统会自动重新提交整个页面, 我不知道如何避免它, 有人能帮助我吗?

7 个答案:

答案 0 :(得分:20)

这是对问题的解释......

单击表单上的“提交”按钮会向Web服务器发送请求,其中包括在表单上输入的所有数据。不仅URL而且表单数据也是请求的一部分,浏览器会记住此请求。如果用户单击“刷新”,浏览器将重复该请求,再次将相同的URL 表单数据发送到Web服务器。

但是表单可以用两种不同的方式提交,GET或POST,具体取决于“form”标签的“method”属性。有一个约定,GET请求没有副作用;它只提取数据但不对数据库进行任何更改。另一方面,如果请求更改数据,则应始终使用POST请求。正如我所说,这些只是约定,它们之间没有太大的技术差异,但一个非常重要的区别是浏览器会在用户尝试重复POST时警告用户 - 点击“刷新”会弹出一个对话框警告用户这可能导致重复操作,并确认他们确实要重新提交。刷新GET请求时,浏览器不会显示此确认信息。

您的表单是否使用了@mk所怀疑的GET方法?如果是这样,将其更改为POST是最简单的解决方案,因为这至少意味着用户在尝试刷新时会收到警告。

但更好的解决方案是@cletus提出的POST + REDIRECT + GET惯用法。这将数据库更新(POST)和视图(GET)分成两个操作。单击浏览器上的刷新然后只重复GET,它没有副作用。

答案 1 :(得分:11)

你想要的成语是:

  1. POST+REDIRECT+GET;或
  2. AJAX表单提交。
  3. POST + REDIRECT + GET的工作原理如下:

    1. 表单提交使用POST方法;
    2. 当JSP或(希望)servlet收到POST时,它会做任何需要做的事情(保存或更新数据或其他);
    3. 然后,servlet或JSP使用Location:HTTP标头将用户重定向到可能是同一个URL的位置。
    4. 这样做的好处是点击重新加载不会重新提交表单。此外,如果您单击浏览器后退按钮,则不会出现“再次提交?”的提示。对话框。

      以下是JSP example

      AJAX提交意味着不是将表单提交回传统意义上的服务器,而是使用表单数据创建一个返回服务器的AJAX请求。该提交做了它需要的东西。单击重新加载只会重新加载页面。它不会重新发送AJAX请求。

答案 2 :(得分:0)

请勿使用GET提交或以其他方式更改数据。请改用POST。您需要将表单更改为

<form action="test.jsp" method="get">

有关详细信息,请参阅http://www.google.com/search?q=get+post

(你的问题也有点不清楚 - 你的意思是在浏览器或容器中刷新(例如Tomcat)?你是什么意思重新提交页面?页面没有提交,表单做。哪个系统?我猜到了你的意思,如果你有别的意思,请告诉我们。)

答案 3 :(得分:0)

如果您在服务器端使用JSP并使用控制器Servlet来控制页面方向。您只需将页面方向模式从“前进”更改为“页面重定向”即可。这样您就可以阻止表单重新提交。 this would be userful to understand it

问候!

答案 4 :(得分:0)

这是解决方案

@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse     response) throws Exception {
    try {   

        if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
        {
        request.setCharacterEncoding("UTF-8");

        String xxx=request.getParameter("xxx");
        S
        boolean result=object.method(xxx);
        String message="";//reurning a messgae is sucess
        if(result==true)
        {
            message="Data Saved successfully";
        }
        else
        {
            message="Error while saving data";  
        }

        return  (new ModelAndView(getMasterrulescreation(),"message",message));
        }
        else //if no value in primary key redirect fresh page 
        {
            return  (new ModelAndView(getMasterrulescreation()));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}   

答案 5 :(得分:0)

我们可以使用Post/Redirect/Get (PRG) pattern来解决问题 多次提交相同的数据。

它的工作原理如下:

用户首次通过POST或GET向服务器提交表单时 方法,然后我们更新应用程序数据库中的状态。

然后我们发送重定向响应以向客户端发送回复。

然后我们使用GET命令加载视图。没有数据 送到这里。由于这是一个新的JSP页面,因此可以安全地使用多个页面 提交。处理请求的代码是幂等的。所以 不对同一请求执行两次相同的操作。

enter image description here

答案 6 :(得分:0)

使用以下脚本可以正常工作。

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>