GWT阻止设置Cookie HTTP头实际设置Cookie?
我是一个GWT noob,但我和比我更高级的人一起工作,我们无法理解为什么服务器返回的cookie作为Set cookie HTTP头实际上没有在浏览器中设置 我使用Tomcat编写了一个具有身份验证调用的服务器。我用HTML编写了一个虚拟网站,它使用web表单向服务器发送带有身份验证信息的请求,并接收包含一个设置Cookie头的响应。这一切都有效。然后,它在同一页面上有另一个不同表单的按钮,该按钮向我的服务器发送一个不同的请求,其中包含一些表单数据,浏览器会按照预期自动将cookie注入到标题中。因此,对于第二次调用,服务器可以从请求中提取cookie头并对请求进行身份验证。这一切都是有效的,是伟大的 现在,对于我们开发的测试GWT应用程序,我使用了在开发新GWT应用程序时自动生成的代码(无AppEngine),并在客户端的EntryPoint类上以以下方式对其进行了修改。我删除了用于输入我的姓名和GWT RPC调用的文本框。我修改了MyHandler,使其不再实现KeyPressedListener或其他功能,而是实现RequestCallback。我编辑了onClick的内容,创建了一个新的RequestBuilder,它发送一篇带有身份验证信息的帖子。到目前为止,这一切都可以正常工作,因为我可以查看服务器上的日志,服务器接收请求,处理请求,并将身份验证cookie放入响应中。使用Firebug,我可以看到响应包含带有必要Cookie信息的Set Cookie头。但是,浏览器从未实际保存此信息。毫不奇怪,对服务器的后续调用不包含cookie GWT在部署时只是编译成JavaScript,对吗?JavaScript不能在HTTP响应和浏览器之间注入自身,不是吗?我已经检查了Response对象,它是来自RequestCallback接口的onResponseReceived()调用的一个参数,并且它不包含任何方法来访问cookie,除非通过getHeaders()调用。不过,我已经放弃了这个电话的结果,而它在那里并不存在。无论如何,浏览器至少应该在代码之前访问HTTP头,并且应该在将代码交给GWT之前获取并设置cookie值。我不仅是GWT新手,也是大多数HTTP客户端开发新手,但我真的偏离了轨道吗 谢谢, 约翰 编辑: 这是我最后得到的代码。我没有改变项目中的任何其他内容GWT阻止设置Cookie HTTP头实际设置Cookie?,http,gwt,cookies,Http,Gwt,Cookies,我是一个GWT noob,但我和比我更高级的人一起工作,我们无法理解为什么服务器返回的cookie作为Set cookie HTTP头实际上没有在浏览器中设置 我使用Tomcat编写了一个具有身份验证调用的服务器。我用HTML编写了一个虚拟网站,它使用web表单向服务器发送带有身份验证信息的请求,并接收包含一个设置Cookie头的响应。这一切都有效。然后,它在同一页面上有另一个不同表单的按钮,该按钮向我的服务器发送一个不同的请求,其中包含一些表单数据,浏览器会按照预期自动将cookie注入到标题
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);
}
模块加载()上的公共void{
最终按钮登录按钮=新按钮(“登录”);
最终按钮请求builderButton=新建按钮(“活动读取”);
最终标签errorLabel=新标签();
//将nameField和sendButton添加到根面板
//使用RootPanel.get()获取整个body元素
RootPanel.get(“sendButtonContainer”).add(loginButton);
get(“sendButtonContainer”).add(requestBuilderButton);
RootPanel.get(“errorLabelContainer”).add(errorLabel);
//创建弹出对话框
final DialogBox DialogBox=新建DialogBox();
setText(“远程过程调用”);
dialogBox.setAnimationEnabled(true);
最终按钮关闭按钮=新按钮(“关闭”);
//我们可以通过访问小部件的元素来设置小部件的id
closeButton.getElement().setId(“closeButton”);
最终标签textToServerLabel=新标签();
final HTML serverResponseLabel=新HTML();
VerticalPanel dialogVPanel=新建VerticalPanel();
dialogVPanel.addStyleName(“dialogVPanel”);
添加(新的HTML(“向服务器发送名称:”);
dialogVPanel.add(textToServerLabel);
添加(新的HTML(
服务器回复:);
dialogVPanel.add(serverResponseLabel);
对话框面板设置水平对齐(垂直面板右对齐);
对话框面板添加(关闭按钮);
setWidget(dialogVPanel);
//添加处理程序以关闭对话框
closeButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
dialogBox.hide();
}
});
//为sendButton和nameField创建处理程序
类LoginHandler实现ClickHandler、RequestCallback{
/**
*当用户单击Send按钮时激发。
*/
公共作废一次点击(点击事件){
dialogBox.show();
serverResponseLabel.setText(Cookies.getCookie(“身份验证令牌”);
最终字符串url=”http://localhost:8080/app/user/auth_token";
RequestBuilder=newrequestbuilder(RequestBuilder.POST,URL.encode(URL));
setHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
StringBuilder参数=新的StringBuilder();
parameters.append(“user=username&password=password&client=gwt”);
试一试{
sendRequest(URL.encode(parameters.toString()),这是);
}
捕获(请求异常e){
serverResponseLabel.setText(例如toString());
}
}
公共void onError(请求,可丢弃异常){
serverResponseLabel.setText(“失败”);
}
接收到公共无效onResponseReceived(请求-请求,响应-响应){
textToServerLabel.setText(Integer.toString(response.getStatusCode());
serverResponseLabel.setText(serverResponseLabel.getText()+Cookies.getCookie(“身份验证令牌”);
}
};
类活动ReadHandler实现单击