http - GWT 阻止 Set-Cookie HTTP header 实际设置 Cookie?

标签 http gwt cookies

我是 GWT 新手,但我正在与比我更高级的其他人一起工作,我们无法弄清楚为什么服务器返回的 cookie 作为 Set-Cookie HTTP header 实际上并未在浏览器中设置。

我使用具有身份验证调用的 Tomcat 编写了一个服务器。我用 HTML 编写了一个虚拟网站,它使用 Web 表单向服务器发送带有身份验证信息的请求,并接收包含 Set-Cookie header 的响应。这一切都有效。然后它在同一页面上有一个不同形式的第二个按钮,该按钮使用一些表单数据向我的服务器发送不同的请求,浏览器自动将 cookie 注入(inject)标题中。因此,对于第二次调用,服务器可以从请求中提取 cookie header 并对请求进行身份验证。这一切都有效而且很棒。

现在,对于我们开发的测试GWT应用程序,我使用了在开发新的GWT应用程序(没有AppEngine)时自动生成的代码,并在客户端的EntryPoint类中按以下方式修改。我删除了用于输入我的名字的文本框和 GWT RPC 调用。我修改了 MyHandler,使其不再实现 KeyPressedListener 或其他任何东西,而是实现了 RequestCallback。我编辑了 onClick 的内容以创建一个新的 RequestBuilder,它发送带有身份验证信息的 POST。到目前为止,这一切都有效,因为我可以在我的服务器上查看日志,它接收请求、处理请求并将身份验证 cookie 放入响应中。使用 Firebug,我可以看到响应包含带有必要 cookie 信息的 Set-Cookie header 。但是,浏览器实际上从未保存此信息。毫不奇怪,对服务器的后续调用不包含 cookie。

GWT 只是在部署时编译成 JavaScript,对吗? JavaScript 不能在 HTTP 响应和浏览器之间注入(inject)自身,可以吗?我已经检查了 Response 对象,它是从 RequestCallback 接口(interface)调用 onResponseReceived() 的参数,它不包含任何方法来访问 cookie,除非通过 getHeaders() 调用。不过,我已经转储了此调用的结果,并且它不存在于此。无论如何,浏览器至少应该在代码之前访问 HTTP header ,并且应该在将代码交给 GWT 之前获取并设置 cookie 值。我不仅是 GWT 的新手,也是大多数 HTTP 客户端开发的新手,但我真的偏离轨道那么远吗?

谢谢,

约翰

编辑:

这是我最终得到的代码。我没有更改项目中的任何其他内容。

public void onModuleLoad() {
        final Button loginButton = new Button("Login");
        final Button requestBuilderButton = new Button("Campaign Read");
        final Label errorLabel = new Label();

        // Add the nameField and sendButton to the RootPanel
        // Use RootPanel.get() to get the entire body element
        RootPanel.get("sendButtonContainer").add(loginButton);
        RootPanel.get("sendButtonContainer").add(requestBuilderButton);
        RootPanel.get("errorLabelContainer").add(errorLabel);

        // Create the popup dialog box
        final DialogBox dialogBox = new DialogBox();
        dialogBox.setText("Remote Procedure Call");
        dialogBox.setAnimationEnabled(true);
        final Button closeButton = new Button("Close");
        // We can set the id of a widget by accessing its Element
        closeButton.getElement().setId("closeButton");
        final Label textToServerLabel = new Label();
        final HTML serverResponseLabel = new HTML();
        VerticalPanel dialogVPanel = new VerticalPanel();
        dialogVPanel.addStyleName("dialogVPanel");
        dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
        dialogVPanel.add(textToServerLabel);
        dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
        dialogVPanel.add(serverResponseLabel);
        dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
        dialogVPanel.add(closeButton);
        dialogBox.setWidget(dialogVPanel);

        // Add a handler to close the DialogBox
        closeButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                dialogBox.hide();
            }
        });

        // Create a handler for the sendButton and nameField
        class LoginHandler implements ClickHandler, RequestCallback {
            /**
             * Fired when the user clicks on the sendButton.
             */
            public void onClick(ClickEvent event) {
                dialogBox.show();

                serverResponseLabel.setText(Cookies.getCookie("auth_token"));

                final String url = "http://localhost:8080/app/user/auth_token";
                RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
                builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
                StringBuilder parameters = new StringBuilder();
                parameters.append("user=username&password=password&client=gwt");
                try {
                    builder.sendRequest(URL.encode(parameters.toString()), this);
                }
                catch(RequestException e) {
                    serverResponseLabel.setText(e.toString());
                }
            }

            public void onError(Request request, Throwable exception) {
                serverResponseLabel.setText("Failure.");
            }

            public void onResponseReceived(Request request, Response response) {
                textToServerLabel.setText(Integer.toString(response.getStatusCode()));
                serverResponseLabel.setText(serverResponseLabel.getText() + Cookies.getCookie("auth_token"));
            }
        };

        class CampaignReadHandler implements ClickHandler, RequestCallback {
            public void onClick(ClickEvent event) {
                dialogBox.show();

                final String url = "http://localhost:8080/app/campaign/read";
                RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
                builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
                StringBuilder parameters = new StringBuilder();
                parameters.append("output_format=short&client=gwt&campaign_urn_list=urn:andwellness:nih");
                try {
                    builder.sendRequest(URL.encode(parameters.toString()), this);
                }
                catch(RequestException e) {
                    serverResponseLabel.setText(e.toString());
                }
            }

            public void onError(Request request, Throwable exception) {
                serverResponseLabel.setText("Failure.");
            }

            public void onResponseReceived(Request request, Response response) {
                textToServerLabel.setText(Integer.toString(response.getStatusCode()));
                serverResponseLabel.setText(response.getText());
            }
        };

        // Add a handler to send the name to the server
        LoginHandler loginHandler = new LoginHandler();
        loginButton.addClickHandler(loginHandler);

        CampaignReadHandler campaignReadHandler = new CampaignReadHandler();
        requestBuilderButton.addClickHandler(campaignReadHandler);
    }

最佳答案

这是浏览器的预期行为:http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method (GWT 的 Response#getHeaders 只是调用 getAllResponseHeaders 并解析字符串)。

如果你想获取cookie,你必须使用cookies对象(GWT中的Cookies类);这显然会过滤掉 httponly cookie。

关于http - GWT 阻止 Set-Cookie HTTP header 实际设置 Cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351390/

相关文章:

javascript - NodeJs 中的静态 HTTP 文件服务器 : Sometimes external . js 和 .css 文件加载正常,有时加载不正确?

java - 如何阻止 java.net.http.HttpClient 发出升级请求?

c - C 中的 HTTP 代理,recv() 不会阻塞?

c - 如何使用基于TCP的HTTP下载图片?

java - 如何在没有 UiBinder 的情况下将 CellTable.Style 与 GWT 2.7.0 一起使用?

java - GWT 使 RPC 阻塞

java - Maven 插件执行 ID

javascript - 如何使用 javascript 检查 .ASPXAUTH cookie 是否存在

javascript - 直到第二次刷新才设置 Cookie

facebook - hapi.js 需要多个身份验证策略?