【问题标题】:How can i Override 302 Status in Http?如何在 Http 中覆盖 302 状态?
【发布时间】:2013-12-10 01:02:35
【问题描述】:

客户端调用一个休息服务,其响应重定向到另一个休息服务使用 sendRedirect() 方法

response.sendRedirect("http://localhost:8080/com.youtube.rest/api/v1/status/toreply"); .

从第二个服务结果返回到客户端。但是当将响应从服务 1 重定向到服务 2 时,服务 1 以状态 302 向客户端确认。我不想从服务 1 向客户端返回任何确认。我怎样才能避免这种承认?或者我想返回状态 200 确认。请提出一些解决此问题的方法。

【问题讨论】:

    标签: java http rest servlets


    【解决方案1】:

    发回状态码302 正是您告诉服务器要做的事情!这就是重定向的作用:它告诉客户端它应该在不同的 URL 下查找资源!

    重定向的状态码是302(找到)。由于 HTTP 1.1 303(参见其他)或 307(临时移动)也可以使用,但 servlet 规范明确规定必须使用 302。另见JavaDoc of HttpServletResponse#sendRedirect:

    (...) 调用此方法会将状态代码设置为 SC_FOUND 302(已找到)。 (...)

    转发到同一网络应用程序中的资源

    如果您想将请求转发到同一 Web 应用程序中的另一个资源/servlet,请使用 RequestDispatcher:

    RequestDispatcher dispatcher =
        request.getRequestDispatcher("path-to-local-content");
    dispatcher.forward(request, response);
    

    转发到同一服务器上另一个 Web 应用程序中的资源

    如果内容在同一服务器上但在另一个 Web 应用程序中,则必须通过 ServletContext 创建 RequestDispatcher:

    ServletContext context = request.getServletContext();
    RequestDispatcher dispatcher =
        context.getRequestDispatcher("/<other-webapp>/<path-to-content>");
    dispatcher.forward(request, response);
    

    请注意,某些服务器不允许跨上下文调度并返回 null 调度程序。在 Tomcat 上,默认禁用跨上下文调度,但可以在 Context configuration 中启用。

    包含来自“外国”网络服务器的内容

    如果内容不是本地托管在同一个服务器上(更准确地说:由同一个servlet引擎),您必须向外部Web服务器打开一个HttpURLConnection并自行检索数据。

    另见:

    【讨论】:

    • 嗨..我同意你的看法。如果我想使用 RequestDispatcher 两个服务应该在同一个服务器中。它在 servlet 中工作正常。但是当我在休息服务中使用它时它给出错误。在我的场景中客户只会调用一次。客户不应该知道接下来会发生什么,它只会等待结果。那么我该如何实现这种情况呢?
    • 您的第二个服务是否“在同一台服务器上”?如果是,它是否也在同一个 Web 应用程序中?你得到什么错误?
    • 我正在使用托管在 tomcat 中的 rest 服务。它不会进入 service2。它在 RequestDispatcher 对象中给出 null 错误。
    • @nixen09 我已经将我的答案扩展到解决跨上下文调度问题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2022-01-20
    • 2013-04-26
    • 2014-01-08
    • 2014-06-29
    • 2022-11-14
    • 2013-01-10
    相关资源
    最近更新 更多