Vaadin Application PushHandler无法使用nginx,spring security查找基于请求的UI

时间:2016-08-17 11:07:24

标签: vaadin vaadin7 vaadin4spring

当激活Push时,每当我打开应用程序打开超过一分钟的标签时,我会收到以下INFO级别日志消息:

16:57:17 INFO  PushHandler - No UI was found based on data in the request, but a slower lookup based on the AtmosphereResource succeeded. See http://dev.vaadin.com/ticket/14251 for more details.

Ticket 14251似乎没有包含我的方案的任何相关信息,如下所示:

该应用程序是Vaadin Spring应用程序

我的用户界面用

注释
@Push(transport=Transport.WEBSOCKET_XHR)

我正在使用配置为push的nginx服务器,如下所示:

map $http_connection $upgrade_requested {
    default upgrade;
    ''      close;
}

server {
    listen          9002;
    server_name     localhost;
    root            /;

    location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;

            proxy_cookie_path ~*^/.* /;
            proxy_pass http://127.0.0.1:9003/;
            proxy_redirect off;
    }

    location /vaadinServlet/PUSH {
            proxy_pass http://127.0.0.1:9003;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $upgrade_requested;
    }

当我只是打开一些标签时会出现此日志消息。实际上没有推送(至少没有由我的应用程序逻辑触发)。这种情况发生在我测试过的所有浏览器中:Firefox,Chrome和Safari。 除了日志消息,我没有发现任何问题。

如何摆脱此日志消息? 这或许可能表明我可能还没有注意到的一些问题吗?

1 个答案:

答案 0 :(得分:2)

基于https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/,nginx中的websocket连接使用proxy_read_timeout配置选项,默认设置为60秒。因此,nginx将在60秒后切断ws连接,然后浏览器将建立新的ws连接。发生这种情况时,重新建立连接的请求应包含" v-uiId ="参数,基于此,服务器应该找到相关的UI,一切都应该继续工作。

您的错误消息表明v-uiId参数存在问题,并且由于某种原因,服务器无法根据该参数找到正确的UI实例。然后服务器回退到另一个查找机制,它遍历UI实例并尝试找到正确的查找机制。这个成功了,一切都在继续。

此外,您的服务器还可能配置了60秒的websocket超时。在这种情况下,nginx或服务器将首先切断连接。有时会发生奇怪的事情,具体取决于事件的顺序。

如果你什么都不做,你将会遇到nginx切断连接和服务器在此之后执行推送操作的潜在问题。如果服务器没有意识到连接已被切断(由于TCP的工作方式),那么它可能会将下一条消息推送到虚空中。

尝试删除/更改nginx和/或服务器中的超时。

根据经验,如果服务器上发生连接关闭,那么Vaadin会立即知道没有活动连接并且会推迟推送。如果中间的某个人在不告诉服务器的情况下切断了连接,那么事情可能会出错。