JSF 2.3 f:websocket 加密设置
JSF 2.3 f:websocket encryption setting
在我的网络应用程序中,加密不是由应用程序服务器进行的,而是由反向代理进行的。我想保持这种状态。
相关技术栈如下:
- 应用服务器:payara 5.181 full
- JavaEE 8/JSF 2.3; Mojarra 2.4.0-m01.payara-p5
由于代理加密,应用服务器配置为不在 web.xml:
内使用加密
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
现在,websocket 连接无法与活动代理一起使用,因为它是由客户端以非加密方式 (ws://...) 建立的。当内容已经在 https 中传送时,浏览器会阻止此操作。
据我了解,浏览器和应用服务器的行为似乎都是正确的。虽然浏览器避免降级,但 websocket 规范第 8.3 "Transport Guarantee" 节指出:
A transport guarantee of NONE must be interpreted by the container as allowing unencrypted ws:// connections
to the websocket [WSC-8.3-1]
有没有办法强制加密(使用 wss://)f:websocket,尽管在应用程序服务器上使用传输保证 NONE?或者是否有其他设置或更好的方法?
目前,我找不到适应 f:websocket 行为的方法,不得不切换回使用普通 javascript websocket 结合经典 websocket serverendpoint。
Is there a way to force encryption (the use of wss://) for the f:websocket, although using transport guarantee NONE on the app server?
websocket URL 通过 ExternalContext#encodeWebsocketURL()
编码。与 JSF 中的往常一样,几乎所有东西都可以通过工厂进行装饰甚至替换,ExternalContext
.
也是如此
下面是一个启动示例,它盲目地将 websocket URL 中的 ws://
替换为 wss://
.
public class CustomExternalContext extends ExternalContextWrapper {
public CustomExternalContext(ExternalContext wrapped) {
super(wrapped);
}
@Override
public String encodeWebsocketURL(String url) {
return super.encodeWebsocketURL(url).replaceFirst("ws://", "wss://");
}
public static class Factory extends ExternalContextFactory {
public Factory(ExternalContextFactory wrapped) {
super(wrapped);
}
@Override
public ExternalContext getExternalContext(Object context, Object request, Object response) throws FacesException {
return new CustomExternalContext(getWrapped().getExternalContext(context, request, response));
}
}
}
为了达到运行,在faces-config.xml
中如下注册:
<factory>
<external-context-factory>com.example.CustomExternalContext$Factory</external-context-factory>
</factory>
在我的网络应用程序中,加密不是由应用程序服务器进行的,而是由反向代理进行的。我想保持这种状态。 相关技术栈如下:
- 应用服务器:payara 5.181 full
- JavaEE 8/JSF 2.3; Mojarra 2.4.0-m01.payara-p5
由于代理加密,应用服务器配置为不在 web.xml:
内使用加密<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
现在,websocket 连接无法与活动代理一起使用,因为它是由客户端以非加密方式 (ws://...) 建立的。当内容已经在 https 中传送时,浏览器会阻止此操作。
据我了解,浏览器和应用服务器的行为似乎都是正确的。虽然浏览器避免降级,但 websocket 规范第 8.3 "Transport Guarantee" 节指出:
A transport guarantee of NONE must be interpreted by the container as allowing unencrypted ws:// connections to the websocket [WSC-8.3-1]
有没有办法强制加密(使用 wss://)f:websocket,尽管在应用程序服务器上使用传输保证 NONE?或者是否有其他设置或更好的方法?
目前,我找不到适应 f:websocket 行为的方法,不得不切换回使用普通 javascript websocket 结合经典 websocket serverendpoint。
Is there a way to force encryption (the use of wss://) for the f:websocket, although using transport guarantee NONE on the app server?
websocket URL 通过 ExternalContext#encodeWebsocketURL()
编码。与 JSF 中的往常一样,几乎所有东西都可以通过工厂进行装饰甚至替换,ExternalContext
.
下面是一个启动示例,它盲目地将 websocket URL 中的 ws://
替换为 wss://
.
public class CustomExternalContext extends ExternalContextWrapper {
public CustomExternalContext(ExternalContext wrapped) {
super(wrapped);
}
@Override
public String encodeWebsocketURL(String url) {
return super.encodeWebsocketURL(url).replaceFirst("ws://", "wss://");
}
public static class Factory extends ExternalContextFactory {
public Factory(ExternalContextFactory wrapped) {
super(wrapped);
}
@Override
public ExternalContext getExternalContext(Object context, Object request, Object response) throws FacesException {
return new CustomExternalContext(getWrapped().getExternalContext(context, request, response));
}
}
}
为了达到运行,在faces-config.xml
中如下注册:
<factory>
<external-context-factory>com.example.CustomExternalContext$Factory</external-context-factory>
</factory>