Payara HttpServletResponse.sendError()没有向浏览器发送原因,只有状态代码



更新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只显示(数字)错误代码,而错误消息会丢失。(我还不知道这是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://,反之亦然
  • 行为发生变化:
    • 如果安全性关闭,则消息将完全发送(400 LDAP credentials invalid!)
    • 如果安全性为ON,则只发送数字代码:400

现在我将在社区版上检查同样的现象。。。

更新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

但在您的情况下,在生产中,它可能只是更改请求的反向代理。