更新4
-
在阅读这个问题之前,请注意:这个问题是基于虚假前提的错误。
-
所描述的问题不存在。
-
我对这种情况越来越困惑,所以我编写了一个Java应用程序,它使用原始套接字(HTTP 1.1和HTTPS 1.1)连接到有问题的服务器。在该原始访问中,服务器总是返回预期的消息。所以问题出在使用
h2
协议的Chrome或Payara上。 -
真正的问题在于Chrome或Payara通过协议
h2
(HTTP/2)上的SSL处理HTTP异常代码的方式。(我会重新设计我的应用程序,以检查h2请求,找出是Java、Payara还是Chrome导致了问题) -
- 当不使用SSL时,错误代码和消息会正确传递(因为Chrome会返回到
HTTP/1.1
,在那里传递消息)
- 当不使用SSL时,错误代码和消息会正确传递(因为Chrome会返回到
-
- 使用SSL时,Chrome只显示(数字)错误代码,而错误消息会丢失。(我还不知道这是Chrome/Payara实现问题,还是HTTP/2除了数字状态错误代码之外可能不支持文本错误消息)
背景
我正在使用Payara服务器托管一些应用程序。在我的DEV服务器上,我使用
5.201#badasfish(build512)(社区)
并且在PROD服务器上我正在运行
Payara服务器企业版5.31.0#badasfish(内部版本4356)
问题
在HttpServlet 中运行以下代码时
@Override protected void doGet(final HttpServletRequest pReq, final HttpServletResponse pResp) throws ServletException, IOException {
pReq.sendError(400, "LDAP credentials invalid!");
}
然后我的Dev服务器返回HTTP状态代码
400 LDAP凭据无效!
而PROD只返回
400
缺少实际消息LDAP credentials invalid!
。
问题
我可以在配置文件或代码中调整任何设置,以便我的Payara PROD能够正确地传递消息吗?
- 正确发送第一条HTTP响应行CCD_ 5
- 而不仅仅是
HTTP/1.1 400
)
注释
- 客户端是一个瘦客户端,当服务器返回4xx代码时,它只获取状态代码并将其显示给用户
- 我使用代码400和特定的消息,因为在这一点上的任何错误都会引起前端的相同反应(不登录用户),但向用户显示不同的消息(实际上有很多不同的情况)
- 与前端开发人员一起制定一个完整的4xx错误代码目录是我现在还不想做的事情。除非我真的陷入了这些问题,并且使用了不同的代码
- 编写包装器JSON响应(实际上包含错误消息)也是如此
更新1
刚刚发现,如果我通过HTTP(在另一个端口上禁用了"安全性"的HTTP侦听器)对PROD服务器进行寻址,它会正确地返回整个消息:HTTP/1.1 400 LDAP credentials invalid!
。
因此,只有通过HTTPS(启用了"安全性"的HTTP侦听器)访问它时,问题才存在。
我会更深入地研究,玩"安全"开关。
更新2
是的。已确认。当PROD:
- 使用Payara管理控制台
- 浏览配置->服务器配置->HTTP服务->HTTP侦听器->http-listener-1
- 然后
- a)翻转"安全"复选框
- b)保存更改
- c)重新启动Payara服务器
- d)将地址协议从
https://
更改为http://
,反之亦然
- d)将地址协议从
- 行为发生变化:
- 如果安全性关闭,则消息将完全发送(
400 LDAP credentials invalid!
)
- 如果安全性关闭,则消息将完全发送(
- 如果安全性为ON,则只发送数字代码:
400
- 如果安全性为ON,则只发送数字代码:
现在我将在社区版上检查同样的现象。。。
更新3
我已经检查了社区版的行为:社区版按预期工作,两次都返回完整的消息。显式:
- 如果安全性关闭,则消息将完全发送(
400 LDAP credentials invalid!
) - 如果安全性为ON,则消息也将完全发送(
400 LDAP credentials invalid!
)(我还尝试过交换侦听器配置,效果也100%良好)
现在我不知道这是否与版本差异有关,
- 或者如果旧的Enterprise Server也正常工作,那么可能是新版本的问题
- 或者,如果更新的Community Server也有(可能的)错误,那么它也可能是更新版本的问题
将继续检查并相应地更新此问题。
Payara服务器有一个名为sendError_1
的属性,CCD_ 15,可用于在发生错误时自定义服务器发送的响应。要将服务器配置为仅发送HTTP状态代码,可以将属性值设置为空字符串。该设置可以应用于postbootasadmin
文件中的虚拟服务器,也可以通过创建虚拟服务器:
set "configs.config.server-config.http-service.virtual-server.server.property.send-error_1=code=400 path=/tmp/400.html reason="
set "configs.config.server-config.http-service.virtual-server.server.property.send-error_2=code=404 path=/tmp/404.html reason=NOT_FOUND"
本例中的虚拟服务器名称为server。启动服务器后,它将打印在服务器日志的开头:Created virtual server server
但在您的情况下,在生产中,它可能只是更改请求的反向代理。