如何解决GWT阻止Set-Cookie HTTP标头实际设置Cookie吗?
| 我是GWT新手,但是正在与比我更先进的其他人一起工作,因此我们无法弄清楚为什么实际上未在浏览器中设置服务器作为Set-Cookie HTTP标头返回的cookie。 我使用Tomcat编写了具有身份验证调用的服务器。我用HTML编写了一个虚拟网站,该网站使用Web表单将带有身份验证信息的请求发送到服务器,并接收包含Set-Cookie标头的响应。所有这一切。然后,它在同一页面上具有另一个表单的第二个按钮,该按钮将不同的请求发送到带有某些表单数据的服务器,并且浏览器会自动按预期将cookie注入标头中。因此,对于第二个调用,服务器可以将Cookie标头从请求中拉出并验证请求。这一切都很好,很棒。 现在,对于我们开发的测试GWT应用程序,我使用了在开发新GWT应用程序(没有AppEngine)时自动生成的代码,并通过以下方式在客户端的EntryPoint类上对其进行了修改。我删除了用于输入我的姓名和GWT RPC调用的TextBox。我修改了MyHandler,使其不再实现KeyPressedListener或其他任何东西,并且实现了RequestCallback。我编辑了onClick的内容,以创建一个新的RequestBuilder来发送带有身份验证信息的POST。到目前为止,所有这些工作正常,因为我可以查看服务器上的日志,并且它接收请求,对其进行处理并将身份验证cookie放入响应中。使用Firebug,我可以看到响应包含带有必要Cookie信息的Set-Cookie标头。但是,浏览器从不实际保存此信息。毫不奇怪,对服务器的后续调用不包含cookie。 GWT在部署时只是编译为JavaScript,对吗?而且JavaScript无法将自己插入HTTP响应和浏览器之间吗?我已经检查了Response对象,该对象是RequestCallback接口的onResponseReceived()调用的参数,它不包含任何方法来访问cookie,除非通过getHeaders()调用。不过,我已经转储了此调用的结果,并且那里不存在该结果。无论如何,浏览器至少应该在代码之前可以访问HTTP头,并且应该在将代码交给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,\"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()),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
类);显然会过滤掉5个cookie。
, 如果您使用RequestBuilder与RPC Servlet联系,则可能是问题所在。特别是如果您在请求中使用的主机与浏览器中使用的主机不同。
说导航到http://localhost/app
但是您的RequestBuilder为for7建立了一个请求
如果您仅使用不带RequestBuilder的RPC,则不应遇到这些问题。
同样,如果您使用的是RequestBuilder,则可能必须通过设置该特定标头来手动提供cookie
在浏览器客户端开发中,cookie以主机名为基础进行处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。