2017-06-05 140 views
0

我访问Tomcat上简单的JSP页面:我的JSP返回一个202(SC_ACCEPTED)状态,但主叫方得到200(SC_OK)状态

<%@ page import = "java.io.Writer" %> 
<% 
try { 
    Writer outWriter = response.getWriter(); 
    outWriter.write ("something"); 
    outWriter.flush(); 
    response.setStatus (HttpServletResponse.SC_ACCEPTED); 
} 
catch (Throwable t) { 
    response.sendError (HttpServletResponse.SC_BAD_REQUEST, t.getMessage()); 
}%> 

但是,当我测试这个页面curl,我得到了200响应代码而不是预期的202:

$ curl -i "http://localhost:8090/somepath/somefile.jsp" 
HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Set-Cookie: JSESSIONID=52......................AD2; Path=/somepath/; HttpOnly 
Content-Type: text/html;charset=ISO-8859-1 
Transfer-Encoding: chunked 
Date: Mon, 05 Jun 2017 08:09:36 GMT 

something 

如果我删除的响应内容:

<%@ page import = "java.io.Writer" %> 
<% 
try { 
    //Writer outWriter = response.getWriter(); 
    //outWriter.write ("something"); 
    //outWriter.flush(); 
    response.setStatus (HttpServletResponse.SC_ACCEPTED); 
} 
catch (Throwable t) { 
    response.sendError (HttpServletResponse.SC_BAD_REQUEST, t.getMessage()); 
}%> 

我收到了所需的响应代码:

$ curl -i "http://localhost:8090/somepath/somefile.jsp" 
HTTP/1.1 202 Accepted 
Server: Apache-Coyote/1.1 
Set-Cookie: JSESSIONID=52......................AD2; Path=/somepath/; HttpOnly 
Content-Type: text/html;charset=ISO-8859-1 
Content-Length: 2 
Date: Mon, 05 Jun 2017 08:12:57 GMT 

是否有一些Tomcat配置更改响应代码?

我的实际目标是模拟某些第三方Web API的响应,该响应预计会返回202响应代码+一些成功请求的简短内容字符串。

我的服务器,它会调用这个API,预计202响应。我想我可以将其更改为接受200和202响应,但我希望我的代码与第三方API的文档匹配。

+1

尝试移动3行以上的setStatus()...机会setStatus已被覆盖或忽略。 –

+0

@MinhKieu这实际上工作,谢谢!你可以发布这个答案。任何想法为什么状态被覆盖/忽略? – Eran

+0

我认为flush()可能已经将状态设置为200.一旦设置了它,它就不能被覆盖。我看到的所有例子都是从一开始就设置状态。确认这一点的最好方法是查看编译过的java类。很好,祝你好运。 –

回答

1

将setStatus()移动到JSP的顶部。查看已编译的JSP以查看编译器如何编写代码。机会一旦被设置,它就不能被覆盖。 flush()方法可能已将Status设置为200.

+0

编译后的类看起来像原始代码,因此无助于理解原因。但是,我在ServletResponse.getWriter()的文档中发现,在PrintWriter上调用flush()会提交response',这可能意味着在调用'flush()'后不能以任何方式更改该响应。 – Eran