Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT阻止设置Cookie HTTP头实际设置Cookie?_Http_Gwt_Cookies - Fatal编程技术网

GWT阻止设置Cookie HTTP头实际设置Cookie?

GWT阻止设置Cookie HTTP头实际设置Cookie?,http,gwt,cookies,Http,Gwt,Cookies,我是一个GWT noob,但我和比我更高级的人一起工作,我们无法理解为什么服务器返回的cookie作为Set cookie HTTP头实际上没有在浏览器中设置 我使用Tomcat编写了一个具有身份验证调用的服务器。我用HTML编写了一个虚拟网站,它使用web表单向服务器发送带有身份验证信息的请求,并接收包含一个设置Cookie头的响应。这一切都有效。然后,它在同一页面上有另一个不同表单的按钮,该按钮向我的服务器发送一个不同的请求,其中包含一些表单数据,浏览器会按照预期自动将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客户端开发新手,但我真的偏离了轨道吗

谢谢,

约翰

编辑:

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

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实现单击