gpt4 book ai didi

java - 使用 Spring、Tomcat 和 Java,如何使用 HTTP header 重定向请求?

转载 作者:行者123 更新时间:2023-11-28 23:34:35 25 4
gpt4 key购买 nike

所以我有一个 org.springframework.stereotype.Controller,如果指定了 HTTP header HA 和 HB,我想做的是正常处理请求。但是,如果请求指定了查询参数 QA 和 QB,我想重定向没有 QA 或 QB 的请求,但带有 HTTP header HA 和 HB,这样 HA 的值为 QA,HB 的值为 QB。

例如,如果传入请求是 HTTP GET ~/rest/mortgage,HTTP header 为 x-name=foo 和 x-date=bar,我将按原样处理该请求。但是,如果传入请求是 HTTP GET ~/rest/mortgage?x-name=foo&x-date=bar,我想使用请求 HTTP GET ~/rest /mortgage 带有 HTTP header x-name=foo 和 x-date=bar。

通过这样做,只需在 Controller 级别添加一个简单的检查,我就可以拥有一个代码路径来处理两种发出 HTTP 请求的方式。这是因为我将 HttpServletRequest 传递到代码的各个部分,所以如果我始终保持 HA 和 HB 而不是 QA 和 QB 的一致性,它会降低代码的圈复杂度。

这可能吗?如果是这样,怎么办?

如果这不可能,我可以通过为 HttpServletRequest 定义我自己的包装器来实现我想要的结果,它会为我进行转换,但这并不是一个优雅的解决方案。

最佳答案

如果你想拦截你需要使用 Servlet 的 HTTP 请求 Filter .

为了替换 URL,您必须 get the Dispatcher对于新的 URL,然后使用 forward() 再次发送请求方法。

像这样:

servletRequest.getRequestDispatcher(modifiedURL)
.forward(servletRequest, servletResponse);

但是,没有明确允许您修改 HTTP header 。解决这个问题的方法是通过扩展 HttpServletRequestWrapper 来包装请求并有一个处理这个的代理对象。 .它已经实现了 HttpServletRequest 因此,无论您在与原始 servlet 请求交互的任何地方,使用它都不会有任何问题。

您可以简单地扩展它并添加您自己的方法,例如 addHeader()并保留内部 Map 或您要添加的一些额外的人工 header 。然后你必须覆盖 getHeaderNames() getHeader() 还可以将原始 header 与您自己的额外 header 组合起来。

您需要做的最后一件事是包装您的原始 servletRequest在你的新wrappedServletRequest在你的过滤器中。所以像这样(其中 WrappedServletRequest 是您扩展 HttpServletRequestWrapper 的新实现):

WrappedServletRequest wrappedServletRequest = 
new WrappedServletRequest(servletRequest);
wrappedServletRequest.addHeader("yourHeader", "yourValue");

wrappedServletRequest.getRequestDispatcher(modifiedURL)
.forward(wrappedServletRequest, servletResponse);

记得加上你的<filter><filter-mapping>你的过滤器在你的web.xml让它工作。

您可能想看看 this article更多细节。它有一些关于为什么你必须这样做的更多信息。

我自己没有尝试过,所以请在下方评论并确认您是否设法让它工作。

关于java - 使用 Spring、Tomcat 和 Java,如何使用 HTTP header 重定向请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750380/

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