1

我有一个简单的 Java 应用程序,它响应 Web 服务请求。

当用户按下按钮时,会向 Java 应用程序发送一条消息。

如果消息是“ping”,则应用程序以“pong”响应,否则 - “uknown message”。

Java应用程序的代码:

@Path("/ping-pong")
public class PingPongService {

    @POST
    @Produces("text/plain")
    public String test(@FormParam("message") final String aMessage) {
        System.out.println("message from client: " + aMessage);
        if ("ping".equalsIgnoreCase(aMessage)) {
            System.out.println("ping.equalsIgnoreCase(aMessage)");
            return "pong";
        } else {
            System.out.println("Unknown message");
            return "unknown message " + aMessage;
        }
    }

}

在 WAR 文件中,我有以下 HTML 代码,它可以工作(当我按下其中一个按钮时,我会从 Java 应用程序获得响应并显示在消息框中):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>JavaScript Ping-Pong Client</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript">

        //This function send post request to the server using jQuery
        function testWithJQuery(message){
            $.post('http://localhost:8345/rest/ping-pong', { message: message }, function(data) {
                alert(data);
            });
        }

        //This function send post request to the server using a low-level XmlHttpRequest instead of the jQuery
        //(no dependencies on external libraries)
        function test(message){
            var http = new XMLHttpRequest();
            var url = "http://localhost:8345/rest/ping-pong";
            var params = "message=" + message;
            http.open("POST", url, true);
            http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            http.setRequestHeader("Content-length", params.length);
            http.setRequestHeader("Connection", "close");
            http.onreadystatechange = function() {
                if(http.readyState == 4 && http.status == 200) {
                    alert(http.responseText);
                }
            };
            http.send(params);
        }
    </script>
</head>
<body>
    <button onclick="test('ping')">Test</button>
    <button onclick="testWithJQuery('ping')">Test using jQuery</button>
</body>
</html>

我想在 Django 应用程序中做完全相同的事情(用户按下一个按钮,一条消息被发送到 Java 应用程序,并且它的响应显示在一个警报消息窗口中)。

Django 生成以下 HTML 代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title></title>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
    //This function send post request to the server using jQuery
    function testWithJQuery(message){
        $.post('http://localhost:8345/rest/ping-pong', { message: message }, function(data) {
            alert(data);
        });
    }

    //This function send post request to the server using a low-level XmlHttpRequest instead of the jQuery
    //(no dependencies on external libraries)
    function test(message){
        var http = new XMLHttpRequest();
        var url = "http://localhost:8345/rest/ping-pong";
        var params = "message=" + message;
        http.open("POST", url, true);
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        http.setRequestHeader("Content-length", params.length);
        http.setRequestHeader("Connection", "close");
        http.onreadystatechange = function() {
            if(http.readyState == 4 && http.status == 200) {
                alert(http.responseText);
            }
        };
        http.send(params);
    }
</script>


</head>
<body>
<button onclick="test('ping')">Test</button>
</body>
</html>

当我在 Django 生成的代码中按下“测试”按钮时,Java 应用程序会收到消息(我在控制台输出中看到了这一点),但 Java 应用程序的响应不会显示在 Django 网站中,即使 HTML 代码与 WAR 文件中的相同。

我该如何解决这个问题,即确保 Java 应用程序的响应显示在 Django 中?

UPD:这是 Chrome 的“网络”窗格中的详细错误描述:

在此处输入图像描述

4

1 回答 1

1

这不是一个直接的答案,而是一些帮助您诊断问题的提示;我在这里发帖是因为它太大而无法发表评论。

  1. 打开 Chrome 调试器 ( shif++ ctrl)i或 Firefox Firebug 并激活“网络”选项卡。
  2. 检查两个版本的帖子并比较标题和正文

如果存在不同的行为,则两个帖子之间应该存在一些差异。

[更新]

我发现了错误 - 请参阅问题中的屏幕截图。错误是“XMLHttpRequest cannot load localhost:8345/rest/ping-pong. Origin localhost:8000 is not allowed by Access-Control-Allow-Origin.”。

该错误是由于浏览器中的安全限制(同源策略)。有一些解决方法(来源:维基百科):

为了使开发人员能够以受控方式规避同源策略,已经使用了许多“黑客”,例如使用片段标识符或 window.name 属性在驻留在不同域中的文档之间传递数据。使用 HTML5 标准,为此制定了一种方法:postMessage 接口,该接口仅在最近的浏览器上可用。JSONP 和跨域资源共享也可用于启用对其他域的类似 ajax 的调用。2 easyXDM 也可用于轻松解决同源策略设置的限制。它是一个轻量级、易于使用且自包含的 Javascript 库,使开发人员可以轻松地跨域边界进行通信和公开 javascript API。

我已经成功使用了子域黑客,请参阅此答案:

于 2012-07-26T15:26:55.487 回答