服务器发送的事件在 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 中不起作用
服务器端 css 在 FireFox 和 Chrome 中不起作用