-4

我是用户界面的新手,我们正在尝试使用 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 代理服务器。

任何帮助将不胜感激。

4

2 回答 2

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标头的 URL 无法处理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请求参数。

浏览器将尝试/foo通过 GET 请求,但由于没有带参数的请求正文(即 no 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();
    }
    
于 2018-05-22T23:25:36.977 回答
0

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

之前通过的网址

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

传递的正确 URL 是

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

感谢 Phil,我必须在其中查看请求和响应的标头以及其他信息,例如位置、来源和推荐人

于 2018-05-24T17:19:35.380 回答