GWT не позволяет HTTP-заголовку Set-Cookie установить файлы cookie? - PullRequest
2 голосов
/ 15 июня 2011

Я новичок GWT, но работаю с кем-то еще, кто более продвинут, чем я, и мы не можем понять, почему cookie-файл, возвращаемый сервером в виде HTTP-заголовка Set-Cookie, фактически не устанавливается в браузере.

Я написал сервер, используя Tomcat, у которого есть вызов аутентификации.Я написал фиктивный веб-сайт на HTML, который использует веб-формы для отправки запроса на сервер с информацией аутентификации и получения ответа, содержащего заголовок Set-Cookie.Это все работает.Затем на той же странице есть вторая кнопка в другой форме, которая отправляет другой запрос на мой сервер с некоторыми данными формы, и браузер автоматически вставляет cookie в заголовок, как и ожидалось.Следовательно, сервер для второго вызова может извлечь заголовок cookie из запроса и аутентифицировать запрос.Все это работает и прекрасно.

Теперь для разработанного нами тестового приложения GWT я использовал код, который автоматически генерируется при разработке нового приложения GWT (без AppEngine), и изменил его следующим образом.пути на стороне клиента класса EntryPoint.Я удалил TextBox для ввода моего имени и вызовов GWT RPC.Я изменил MyHandler, чтобы он больше не реализовывал KeyPressedListener или что-либо еще и реализовывал RequestCallback.Я отредактировал содержимое onClick, чтобы создать новый RequestBuilder, который отправляет POST с информацией аутентификации.Пока что все это работает, так как я могу просматривать журналы на моем сервере, и он получает запрос, обрабатывает его и помещает файл cookie аутентификации в ответ.Используя Firebug, я вижу, что ответ содержит заголовок Set-Cookie с необходимой информацией cookie.Тем не менее, браузер никогда не сохраняет эту информацию.Неудивительно, что последующий вызов на сервер не включает cookie.

GWT просто компилируется в JavaScript при развертывании, правильно?И JavaScript не может внедрить себя между HTTP-ответом и браузером, не так ли?Я проверил объект Response, который является параметром для вызова onResponseReceived () из интерфейса RequestCallback, и он не содержит никакого метода для получения доступа к cookie, кроме как через вызов getHeaders ().Я сбросил результаты этого звонка, и его там нет.В любом случае браузер должен, по крайней мере, получать доступ к заголовку HTTP перед кодом и должен захватывать и устанавливать значения файлов cookie перед передачей кода в GWT.Я не только новичок в 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);
    }

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Это ожидаемое поведение браузеров : http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method (GWT Response#getHeaders просто вызывает getAllResponseHeaders и анализирует строку).

Если вы хотите получитькуки, вы должны использовать объект cookies (класс Cookies в GWT);который явно отфильтровывает httponly куки.

0 голосов
/ 15 июня 2011

Если вы используете RequestBuilder для связи с сервлетом RPC, возможно, это проблема. Особенно, если вы используете в своем запросе другой хост, чем тот, который есть в вашем браузере.

Скажем, навигация к http://localhost/app

Но ваш RequestBuilder создает запрос для http://machinename/app/servlet.

Если вы просто используете RPC без RequestBuilder, у вас не должно быть этих проблем.

Также, если вы используете RequestBuilder, вам, возможно, придется вручную предоставлять файлы cookie через , устанавливая этот конкретный заголовок

В клиентской разработке браузера файлы cookie обрабатываются на основе имени хоста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...