使用 JQuery 两次提交表单

twice Form submission using JQuery

我是 UI 的新手,我们正在尝试使用 JQuery 实现网络调用,我们有观察者一个奇怪的网络调用问题,即当我们尝试执行post http 调用我们在服务器访问日志中有观察者首先进行 http post 调用,然后立即存在一个 http get 调用。

请在 .jsp 页面下方找到:

<html>

<head>
<script type="text/javascript"
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<%
    String urlVal = (String) request.getAttribute("dataURL");
%>
<%
    String emailID = (String) request.getAttribute("emailID") ;
%>

<script type="text/javascript">
var url="<%=urlVal%>";
alert(url);

     function navigateWithForm() {
        var form = $('<form></form>');
        form.attr({
            method: 'POST',

            action: url
        });
        form.append(getInput());
        form.appendTo('body').submit();

     }

     function getInput() {
         alert("<%=emailID%>");
        return $('<input type="hidden" />').attr({
            name: 'header',
            value: '<%=emailID%>'   
        });
    }

    $(document).ready(function() {
        navigateWithForm();
    });

</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>

</head>


</html>

后端服务部署在weblogic中,采用spring 2.5框架设计。我们有用于负载平衡的 apache 代理服务器。

任何帮助将不胜感激。

你问题中的代码没有什么特别的问题(除非你真的想使用 AJAX 但我觉得那是一个不同的问题)。

您的 server-side 代码似乎实现了典型的 Post/Redirect/Get 请求处理模式。

这似乎是正在发生的事情

Browser               |  Server
----------------------|-----------------------------
create form           |
  action=urlVal       |
  method=POST         |
                      |
submit form           |
  POST "urlVal" -------->
                      |
                      |  Process request
                      |
                    <--- Response
                      |    302 Found
                      |    Location: someUrl
                      |
GET "someUrl" ---------->
                      |
                    <--- Response
                      |    500 Internal Server Error

因此 URL 您的 server-side 代码添加到 302 Found 响应的 Location header,无法处理 GET 由该响应产生的请求。您需要修改您的 server-side 代码以处理 GET 请求或使用不同的 Location 响应。


例如 (Spring MVC),假设您的 urlVal"/foo" 并且您有

@RequestMapping("/foo")
public String handleFoo(@RequestParam String header) {
    // process, etc
    return "redirect:/foo";
}

返回一个 redirect 这样的响应告诉客户端(浏览器)通过响应 headers 执行 GET 请求...

302 Found
Location: /foo

注意该方法如何需要 header 请求参数。

浏览器将尝试通过 GET 请求 /foo,这将失败,因为没有带参数的请求 body(即没有 header)。

解决方案是:

  • 重定向到响应 GET 请求的现有 URL
  • 处理 GET 您要重定向到 URL 的请求

    @RequestMapping(path = "/foo", method = RequestMethod.GET)
    public String getFoo() { // note, no required parameters
        // etc
    }
    

    或者,

  • 以不同的方式回应。即使是空响应也可以

    @RequestMapping("/foo")
    @ResponseBody
    public ResponseEntity<Void> handleFoo(@RequestParam String header) {
        // process, etc
        return ResponseEntity.ok().build();
    }
    

经过多日的奋斗,我终于找到了解决问题的方法。这确实是一个很小的变化。希望该解决方案对正在为该问题苦苦挣扎的其他人有用。实际问题是 Jquery 调用的 url/action。

URL 较早通过

上下文:root?param1=value¶m2=2

正确的 URL 通过是

上下文:root/?param1=value¶m2=2.

感谢 Phil,我必须在其中查看请求和响应的 header 以及位置、来源和引荐来源网址等其他信息