HttpServletResponse的状态代码是不是在HTTP响应报头(HTTPServletRe

2019-10-31 23:02发布

我有很简单的JAX-RS WS:

@Stateless
@Path("/foo")
public class FooFacadeBean {     

    @GET
    @Produces(MediaType.TEXT_HTML)
    public String performFooCall(@Context HttpServletRequest request, @Context HttpServletResponse response) {
        response.setStatus(500);
        return "Hello";
    }
}

部署后,我执行:卷曲-v本地主机:8080 / foo,那么结果是:

About to connect() to localhost port 8080
Trying 127.0.0.1...
connected
Connected to localhost (127.0.0.1) port 8080
GET /foo HTTP/1.1
User-Agent: curl/7.26.0
Host: localhost:8080
Accept: */

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2 Java/Sun Microsystems Inc./1.6)
Server: GlassFish Server Open Source Edition 3.1.2
Content-Type: text/html
Transfer-Encoding: chunked
Date: Thu, 26 Jul 2012 13:52:10 GMT

Hello 

Connection to host localhost left intact
Closing connection

正如你所看到的HTTP状态代码没有改变,尽管它是手动设置。 为什么会出现这种情况? 我花了很多的时间没有任何结果google搜索。

这样的解决方法,因为返回Response对象,像这样:

Response.status(404).entity("Hello").build();

完美的作品!

GlassFish使用JERSEY作为JAX-RS实现。 我用的Glassfish的嵌入式类型。

Answer 1:

基本上,这不是你应该如何使用新泽西州。

这里是发生了什么:

  • 该方法执行,而你与ServletResponse的互动和状态代码设置为500。不过既然你不写任何数据,响应不提交。

  • 然后该方法返回一个字符串值。 由于泽西没有办法知道,如果你已经用ServletResponse的互动与否的方式,它可以正常工作。

  • 返回字符串方法意味着200响应代码(空隙意味着204等)。 泽西试图响应代码设置为默认,最终由主叫setStatus(200)上的响应的实例。 由于反应尚未提交,这不是一个问题,和500的响应变为200。

  • HttpServletResponse的是承诺,并发送回客户端。

我假设你想要做的是返回不同的状态代码,但只有一个例外情况。 要做到这一点的方法是在正常情况下返回一个字符串,然后抛出一个WebApplicationException在特殊情况下。

@GET
@Produces(MediaType.TEXT_HTML)
public String performFooCall() {
    if (isNormal()) {
        return "Hello";
    }
    throw new WebApplicationException(Response.status(500).entity("Hello").build());
}

或者,你可以抛出一个标准的异常,并控制它是如何呈现为一个单独的响应ExceptionMapper 。



Answer 2:

新泽西州建设一个新的响应,从而设置响应代码在你的代码,是后来重写。 你必须建立在你的代码一个新的响应,并把你字符串中的响应(和更改您的返回值),也可以创建一个过滤器,将过滤后chaing工作和改变响应状态。

看这里了解更多详情



文章来源: HTTPServletResponse status code is not in HTTP response header