httpservelet 响应不返回 sendError 状态代码

vbN*_*bie 4 java servlets httpresponse error-code httprequest

我试图确定为什么网络服务器响应最初在处理过程中抛出异常;然后客户端返回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();
    }
    
    
    }   
    
    Run Code Online (Sandbox Code Playgroud)

handleGetClient 方法处理该过程,并在发生错误时引发异常并被捕获。然后,该方法使用 sendError 方法来设置返回的错误代码,并且在日志调试时,我可以看到该错误代码已设置为该特定错误 (500)。但是,一旦调用返回到dispatchRequest 方法,httpservletResponse 状态实际上是(200)。我看不出这种情况发生在哪里以及为什么。最初我以为我可以将方法更改为 int 以返回错误代码,但我只能对此代码进行更改。

有任何想法吗?

Meh*_*hdi 5

您可以尝试以下方法之一:

response.resetBuffer ();
response.setStatus (HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.flushBuffer ();
Run Code Online (Sandbox Code Playgroud)

或者如果您有一个与 500 代码匹配的错误页面web.xml

response.reset ();
response.setError (HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
Run Code Online (Sandbox Code Playgroud)

对于任何一般错误,您还可以考虑使用异常映射器,因此您不必自己处理错误代码,而只需抛出一个异常来处理状态代码返回。

IE:throw new InternalServerException ("Your message");