服务器发送的事件在 Chrome 中不起作用

Posted

技术标签:

【中文标题】服务器发送的事件在 Chrome 中不起作用【英文标题】:Server Sent Events not working in Chrome 【发布时间】:2018-09-22 13:05:14 【问题描述】:

我正在使用 Angular 4 和 java 开发一个 Web 应用程序。我正在使用服务器发送的事件将一些文本数据发送到前端。在后端我使用球衣,这是我的后端代码

eventOutput.write(new OutboundEvent.Builder()
       .id(decodedToken)
       .name("responseBody")
       .data(String.class, respBody.toString()).build());

前端我使用的是 Angular 4,代码看起来像

var evtSource = new EventSource("url");
 source.addEventListener('eventName', (event) => 
    console.log(event);
);

在 Mozilla firefox 中一切正常。当我将 chrome 与 tomcat 和 windows 一起使用时,一切正常。但是使用 tomcat+linux 和 chrome,我在 console.as 中看到了错误

EventSource 的响应包含一个不是 UTF-8 的字符集(“iso-8859-1”)。 中止连接。

可能是什么问题。解决方法是什么?请帮忙。任何帮助,将不胜感激。谢谢。

【问题讨论】:

你能接受有用的答案还是自己写?见***.com/help/someone-answers 【参考方案1】:

Tomcat 默认支持字符集:iso-8859-1。请尝试

@Produces("application/json;charset=UTF-8")
eventOutput.write(new OutboundEvent.Builder()
       .id(decodedToken)
       .name("responseBody")
       .data(String.class, respBody.toString()).build());

【讨论】:

【参考方案2】:

如果是 linux 中的 tomcat 问题,可以更新 bin\startup.sh 以下行

export JAVA_OPTS="-Dfile.encoding=utf-8"

见Force tomcat to use UTF-8 in linux教程

【讨论】:

但这不会应用于所有请求吗?我们可以只为事件流做任何事情吗? 尝试添加到builder .mediaType(MediaType.APPLICATION_JSON_TYPE); or .mediaType(MediaType.APPLICATION_JSON_TYPE+ ";charset=utf-8"); builder只带一个MediaType参数,而上面的sn-p建议使用String类型。此外,SSE 应该作为文本/事件流发送,所以理想的 MediaType 应该是 MediaType.SERVER_SENT_EVENTS 不是吗?然后有可能覆盖字符集? 我知道你可以将 ";charset=UTF-8" 连接到相关的媒体类型 整个流是text/event-stream,但是每个事件都有自己的媒体类型(可以是text/plain,为了简化测试)

以上是关于服务器发送的事件在 Chrome 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

javascript keydown在chrome和firefox中不起作用[关闭]

单选按钮更改事件在 chrome 或 safari 中不起作用

Android 自动填充服务在 Chrome 中不起作用

服务器端 css 在 FireFox 和 Chrome 中不起作用

addEventListener 在 Chrome 中不起作用

预检 CORS 请求在 Chrome 60 中不起作用