使用 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 中保持活跃