gpt4 book ai didi

java - 让 Java servlet 充当代理的代码?

转载 作者:IT老高 更新时间:2023-10-28 20:47:55 25 4
gpt4 key购买 nike

我有两个 Java Web 应用程序,它们有一个映射到特定 URL 的 servlet:

red.war/
WEB-INF/classes
com.me.myorg.red.RedServlet (maps to http://red.example.com/doStuff)
blue.war/
WEB-INF/classes
com.me.myorg.blue.BlueServlet (maps to http://blue.example.com/doStuff)

我想将这些应用程序(我称它们为我的“后端应用程序”)放在一个“代理应用程序”(servlet)后面,该代理应用程序将决定这两个应用程序中的哪一个最终将为客户端请求提供服务。

此代理网络应用将接收传入的 HTTP 请求,并确定将请求转发到 2 个“后端应用”(红色或蓝色)中的哪一个。然后,请求将被转发到 http://red.example.com/doStuff(然后由 RedServlet#doGet(...) 处理)或 http://blue.example.com/doStuff(然后由 BlueServlet#doGet(...) 处理)。从后端应用程序返回的响应(同样,RedServlet#doGet(...)BlueServlet#doGet(...))然后将返回到代理servlet,并最终返回给客户端。

换句话说,在伪代码中:

public class ProxyServlet extends HttpServlet {
@Override
public doGet(HttpServletRequest request, HttpServletResponse response) {
String forwardingAddress;
if(shouldBeRed(request))
forwardingAddress = "http://red.example.com/doStuff";
else
forwardingAddress = "http://blue.example.com/doStuff";

PrintWriter writer = response.getWriter();

writer.write(getResponseFromBackend(forwardingAddress, request));
}

private String getResponseFromBackend(String addr, HttpServletRequest req) {
// Somehow forward req to addr and get HTML response...
}
}

这可能吗?如果可以,我需要如何以及编写什么代码才能使其工作?

最佳答案

您可以使用 RequestDispatcher 通过以下方式转发您的请求:

RequestDispatcher dispatcher = httpRequest.getRequestDispatcher(forwardingAddress);

// here you have the choice whether to use include(..) or forward(..) see below
if(useInclude)
dispatcher.include(httpRequest, httpResponse);
else
dispatcher.forward(httpRequest, httpResponse);

... 其中 useInlcude 设置为您的选择,具有以下选项:

  • include
    这可能是您想要做的:将 forwardingAdress 中的内容加载到您的响应中。
    • 这意味着您甚至可以在一个响应中包含多个目标。
    • 客户甚至不会意识到这个过程,也不需要能够看到目标文档。
  • forward
    forwardingAddress发送一个转发。这将告诉客户端向指定的 URL 提交 新请求
    • 如果您在带有开发者工具的浏览器中执行此操作,您将看到第二个请求。
    • 客户端必须能够查看和加载目标 URL。
    • 您只能转发到一个目标。

请参阅以下链接:

  • RequestDispatcher javadoc ,特别是对于注释:
    • forward 应该在响应提交给客户端之前调用(在刷新响应正文输出之前)。如果已提交响应,则此方法将引发 IllegalStateException。响应缓冲区中未提交的输出在转发之前会自动清除。
    • 包括:请求和响应参数必须是传递给调用 servlet 服务方法的相同对象,或者是包装它们的 ServletRequestWrapper 或 ServletResponseWrapper 类的子类。
  • URLRewriteFilter example
    虽然这个例子是使用 Filter 而不是 Servlet 实现的,但行为是相同的(注意:这个例子是我的框架的一部分,因此包含父类中的一些开销。只需查看相关部分...)

关于java - 让 Java servlet 充当代理的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com