java - httpservelet 响应未返回 sendError 状态代码
问题描述
我试图确定为什么最初在处理过程中引发异常的网络服务器响应;然后返回 200 OK 客户端。详细情况如下:
从 Web 应用程序向 Web 服务器发送请求,如果发生错误,则会捕获异常并返回相关代码和/或消息,如下所示:
public void dispatchRequest(HttpServletRequest req, HttpServletResponse res) { if (method.equalsIgnoreCase("get")) { doGet(req, res); } else { res.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); return; } } void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, HTTPServerException { handleGetClient(request, response); } @SuppressWarnings("unchecked") private void handleGetClient(HttpServletRequest request, HttpServletResponse response) throws IOException, HTTPServerException { ... } catch (IOException e) { logger("I/O Error during playback with parameters (additional parameters logged) {0}: {1}",traceParams,e.toString()); logger(Level.FINER, "I/O Error during playback with parameters {0}: {1}", parameters, e.getMessage()); logger(Level.FINER, "I/O Error during playback with parameters {0}: {1}", parameters, e); sendError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR); ... } protected void sendError(HttpServletResponse response, int errCode) { response.setContentType("text/plain"); try { response.sendError(errCode,"ERROR"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
handleGetClient 方法处理该过程,并在发生错误时抛出捕获的异常。然后该方法使用 sendError 方法设置返回的错误代码,在日志调试时我可以看到在这个特定的错误(500)中设置了这个。但是一旦调用返回到 dispatchRequest 方法,httpservletResponse 状态实际上是 (200)。我看不出这发生在哪里以及为什么。最初我以为我可以将方法更改为 int 以返回错误代码,但我仅限于我可以对此代码进行的更改。
有任何想法吗?
解决方案
您可以尝试以下方法之一:
response.resetBuffer ();
response.setStatus (HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.flushBuffer ();
或者,如果您有一个与 500 代码匹配的错误页面web.xml
:
response.reset ();
response.setError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
您还可以考虑对任何一般错误使用异常映射器,因此您可以只抛出一个异常来处理状态代码返回,而不是自己玩错误代码。
IE:throw new InternalServerException ("Your message");
推荐阅读
- graphql - 如何在 GraphQL 中将多个对象作为数组返回
- android - 是否有可能做到这一点?从选择图像到捕获图像
- javascript - Uncaught SecurityError: Blocked a frame with origin \"null\" from access a cross-origin frame
- python - 如何在我的目录中的所有文件夹上运行子进程?
- python - 在 Python 中使用赋值表达式时如何完成赋值语句“x = y := f(x)”?
- machine-learning - PCANET中的线性层(卷积层)
- pandas - 在多列 DataFrame 上获取日志值
- php - 如何在 Symfony 4 中实现处理程序?
- javascript - 使用 SQL 数据库中的 PHP 和 JavaScript 登录
- git - 如何修复文件`package.json`中命令`git flow`的操作?