使用 Safari 错误在 websockets 和 Tomcat 上强制使用 SSL

Posted

技术标签:

【中文标题】使用 Safari 错误在 websockets 和 Tomcat 上强制使用 SSL【英文标题】:Forcing SSL on websockets and Tomcat With Spring using Safari bug 【发布时间】:2019-07-09 17:07:39 【问题描述】:

我们有一个在 Tomcat 8.5 上使用带有 Spring 的 websockets 的应用

我们发现使用这种组合的问题

使用 context.xml 中的 <security-constraint> 在 tomcat 中强制 SSL 连接 使用spring 4.2.6+ 从 Safari 浏览。

我们遇到的问题就是这个。

WebSocket - Safari 9 - Invalid UTF-8 sequence in header value

基本上 Safari 收到了一个空的 Expires 标头发送给它。它为空的原因是由于 SPR-14053 在配置缓存时引入了重置 Expires Header。

https://github.com/spring-projects/spring-framework/issues/18625

发生的事情是在 Tomcat 中使用而不是禁用ProxyCaching 时,Tomcat 设置和 Expires Header

https://github.com/apache/tomcat/blob/8.5.x/java/org/apache/catalina/authenticator/AuthenticatorBase.java#L508

我相信因为 Header 之前是 Tomcat 设置的,而不是从响应中删除 Expire 标头,而是将其设置为空白,这会导致 safari 出现问题。

我知道我可以解决这个问题,我的问题是,应该在哪里解决这个问题?这应该针对 Safari、Spring 或 Tomcat 的错误列表提交吗?

【问题讨论】:

【参考方案1】:

哦,我刚刚意识到,在 Safari 之外修复了它们在空标题上的行为。最好将以下内容添加到 context.xml

<Valve className="org.apache.catalina.authenticator.SSLAuthenticator" disableProxyCaching="false"/>

并允许 Spring 像往常一样设置缓存属性。而不是让 Tomcat 和 Spring 为使用哪个缓存头而争吵。

【讨论】:

以上是关于使用 Safari 错误在 websockets 和 Tomcat 上强制使用 SSL的主要内容,如果未能解决你的问题,请参考以下文章

IOS safari 和 Chrome 阻止了我的 websocket django 频道

让 WebSocket 在 Mobile Safari 中保持活跃

PHP websocket不适用于safari,标头修改

Safari 5 / iOS,WebSocket 握手有时有效

Websockets 消息丢失

Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常