Я новичок 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);
}