Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring、Tomcat和Java,如何使用HTTP头重定向请求?_Java_Spring_Spring Mvc_Tomcat - Fatal编程技术网

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

使用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

所以我有一个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的一致性,那么代码的圈复杂度就会降低

这可能吗?如果是,怎么做


如果这是不可能的,我可以通过为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);