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

问题描述 投票:0回答:1

背景

我正在使用 Payara 服务器托管一些应用程序。 在我正在使用的 DEV 服务器上

5.201 #badassfish(build 512)(社区)

在我正在运行的 PROD 服务器上

Payara Server Enterprise 5.31.0 #badassfish(内部版本 4356)

问题

在 HttpServlet 中运行以下代码时

@Override protected void doGet(final HttpServletRequest pReq, final HttpServletResponse pResp) throws ServletException, IOException {
    pReq.sendError(400, "LDAP credentials invalid!");
}

然后我的开发服务器返回 HTTP 状态码

400 LDAP 凭据无效!

而 PROD 只返回

400

缺少实际消息

LDAP credentials invalid!

问题

我可以在配置文件或代码中调整任何设置,以便我的 Payara PROD 实际上正确地传递消息吗?

  • 正确发送第一个 HTTP 响应行
    HTTP/1.1 400 LDAP credentials invalid!
    ,
  • 而不仅仅是
    HTTP/1.1 400

注意事项

  • 客户端是瘦客户端,只有在服务器返回 4xx 代码时才抓取状态代码并显示给用户。
  • 我正在使用代码 400 和特定消息,因为此时的任何错误都会导致前端做出相同的反应(不登录用户),但要显示不同的消息(实际上有很多不同的情况)给用户。
  • 与前端开发人员一起制定完整的 4xx 错误代码目录是我目前不想做的事情。除非我真的被那个问题困扰并使用不同的代码。
  • 编写包装器 JSON 响应(实际上包含错误消息)也是如此。

更新 1

刚刚发现,如果我通过 HTTP(禁用“安全”的 HTTP 侦听器,在不同的端口上)寻址 PROD 服务器,它会正确返回整个消息:

HTTP/1.1 400 LDAP credentials invalid!
.

所以问题只存在于通过 HTTPS(启用“安全”的 HTTP 侦听器)访问时。

我会进一步深入研究,玩“安全”开关。

更新 2

是的。确认的。在生产时:

  • 使用 Payara 管理控制台
  • 浏览配置 -> 服务器配置 -> HTTP 服务 -> HTTP 侦听器 -> http-listener-1
  • 还有
    • a) 翻转“安全”复选框,
    • b) 保存更改
    • c) 重启 Payara 服务器
    • d) 在浏览器中将地址协议从
      https://
      更改为
      http://
      ,反之亦然
  • 行为改变:
    • 如果安全性关闭,消息将被完全发送(
      400 LDAP credentials invalid!
    • 如果安全开启,则只发送数字代码:
      400

现在我会在社区版上检查同样的现象......

更新 3

我检查了社区版的行为:社区版按预期工作,两次都返回完整消息。显式:

  • 如果安全性关闭,消息将被完全发送(
    400 LDAP credentials invalid!
  • 如果安全开启,消息也会被完全发送 (
    400 LDAP credentials invalid!
    ) (我也尝试过交换侦听器配置,也 100% 正常工作)

现在我不知道这是否与版本差异有关,

  • 或者如果旧的 Enterprise Server 也能正常工作,那么它可能是新版本的问题?
  • 或者如果较新的社区服务器也有那个(推测的)错误,那么它也可能是较新版本的问题?

将继续检查并相应地更新此问题。

exception http-status-code-400 payara
1个回答
0
投票

Payara Server 有一个名为

sendError_1
, ... ,
sendError_N
的属性,可用于自定义发生错误时服务器发送的响应。要将服务器配置为仅发送 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

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

© www.soinside.com 2019 - 2024. All rights reserved.