两次使用JQuery提交表单

时间:2018-05-17 22:47:50

标签: javascript java jquery spring-2.5

我是UI的新手,我们正在尝试使用JQuery实现一个Web调用,我们有观察者一个奇怪的webcall问题,即,当我们尝试进行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代理服务器用于负载平衡。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

您的服务器端代码似乎正在实施典型的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

因此,您的服务器端代码添加到302 Found响应的Location标头的网址无法处理该响应产生的GET请求。您需要修改服务器端代码以处理GET请求或使用不同的Location进行响应。

例如(Spring MVC),说你的urlVal"/foo"并且你有

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

返回重定向响应,告诉客户端(浏览器)通过响应标头执行GET请求...

302 Found
Location: /foo

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

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

解决方案是:

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

    的网址的GET次请求
    @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();
    }
    

答案 1 :(得分:0)

经过多日的努力,我找到了问题的解决方案。这真的是一个很小的变化。希望该解决方案对于正在努力解决该问题的其他人有用。实际问题是Jquery调用的url / action。

之前传递的网址

上下文:根参数1 =值安培; param2的= 2

传递的正确网址是

上下文:?根/参数1 =值安培; param2的= 2

感谢Phil,我必须看到请求和响应的标题以及其他位置,来源和引荐来源