使用Spring、Tomcat和Java,如何使用HTTP头重定向请求?
所以我有一个org.springframework.stereotype.Controller,如果指定了HTTP头HA和HB,我想做的是正常处理请求。但是,如果请求指定了查询参数QA和QB,我想重定向请求,但不使用QA或QB,而是使用HTTP头HA和HB,这样HA的值为QA,HB的值为QB 例如,如果传入的请求是HTTP GET~/rest/mortgage,带有HTTP头x-name=foo和x-date=bar,我将按原样处理该请求。但是,如果传入的请求是HTTP GET~/rest/mortgage?x-name=foo&x-date=bar,我想用HTTP头x-name=foo和x-date=bar的请求HTTP GET~/rest/mortgage重定向到我自己 通过这样做,只需在控制器级别添加一个简单的检查,我就可以拥有一个处理这两种类型的HTTP请求的代码路径。这是因为我将HttpServletRequest传递给代码的各个部分,因此如果我始终保持HA和HB而不是QA和QB的一致性,那么代码的圈复杂度就会降低 这可能吗?如果是,怎么做使用Spring、Tomcat和Java,如何使用HTTP头重定向请求?,java,spring,spring-mvc,tomcat,Java,Spring,Spring Mvc,Tomcat,所以我有一个org.springframework.stereotype.Controller,如果指定了HTTP头HA和HB,我想做的是正常处理请求。但是,如果请求指定了查询参数QA和QB,我想重定向请求,但不使用QA或QB,而是使用HTTP头HA和HB,这样HA的值为QA,HB的值为QB 例如,如果传入的请求是HTTP GET~/rest/mortgage,带有HTTP头x-name=foo和x-date=bar,我将按原样处理该请求。但是,如果传入的请求是HTTP GET~/rest/mo
如果这是不可能的,我可以通过为HttpServletRequest定义自己的包装器来实现我想要的结果,该包装器为我进行转换,但这不是一个优雅的解决方案。如果您想要拦截HTTP请求,您需要使用Servlet 为了替换URL,您必须为新URL创建一个新的URL,然后使用该方法再次发送请求 大概是这样的:
servletRequest.getRequestDispatcher(modifiedURL)
.forward(servletRequest, servletResponse);
但是,不允许您显式修改HTTP头。解决这个问题的方法是包装请求,并使用代理对象来处理它,方法是扩展。它已经实现了,所以无论您在哪里与原始servlet请求交互,使用它都不会有任何问题
您可以简单地扩展它并添加自己的方法,如addHeader()
,并保留一个内部的或您正在添加的额外的人工头。然后,您只需覆盖,并将原始标题与您自己的额外标题合并
您最不需要做的事情是将原始的servletRequest
包装到新的wrappedServletRequest
过滤器中。所以类似这样的东西(其中WrappedServletRequest
是扩展HttpServletRequestWrapper
的新实现):
请记住在web.xml
中添加过滤器的
和
,使其正常工作
您可能需要查看更多详细信息。它提供了一些更多的信息,说明你为什么要这样做
我自己没有尝试过,所以请在下面发表评论并确认您是否成功地让它工作。这听起来更像是ServletFilter应该处理的事情。该可能解决方案中缺少的可能重复之处是如何添加HA和HB(在转换的请求中添加HTTP头)。该解决方案为转换请求提供了一个显而易见的答案。好的,您需要将两个想法结合在一起。我在下面贴了一个试探性的答案,看看是否有效。
WrappedServletRequest wrappedServletRequest =
new WrappedServletRequest(servletRequest);
wrappedServletRequest.addHeader("yourHeader", "yourValue");
wrappedServletRequest.getRequestDispatcher(modifiedURL)
.forward(wrappedServletRequest, servletResponse);