Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 boot 使用Spring引导转发HTTP请求_Spring Boot_Interceptor - Fatal编程技术网

Spring boot 使用Spring引导转发HTTP请求

Spring boot 使用Spring引导转发HTTP请求,spring-boot,interceptor,Spring Boot,Interceptor,我正在实现一个“验证”服务,我想验证以下HTTP请求属性: 请求头 请求主体 查询参数 URL参数 验证上述属性后,我需要将相同的请求转发给具有完全相同URL的下游服务(包括根上下文和所有其余的头、查询参数和URL参数属性) 我已尝试使用Rest控制器实现此功能: @RequestMapping(value= "/**") public String validate( @RequestParam Map<String,String> requestPar

我正在实现一个“验证”服务,我想验证以下HTTP请求属性:

  • 请求头
  • 请求主体
  • 查询参数
  • URL参数
验证上述属性后,我需要将相同的请求转发给具有完全相同URL的下游服务(包括根上下文和所有其余的头、查询参数和URL参数属性)

我已尝试使用Rest控制器实现此功能:

@RequestMapping(value= "/**")
public String validate(
            @RequestParam Map<String,String> requestParameters,
            @RequestHeader HttpHeaders headers,
            HttpServletRequest request) {
   // validate headers
   // validate body
   // validate URL parameters
   // validate query parameters

   forwardRequest()
}
@RequestMapping(value=“/**”)
公共字符串验证(
@RequestParam映射requestParameters,
@RequestHeader HttpHeaders标头,
HttpServletRequest(请求){
//验证标题
//验证体
//验证URL参数
//验证查询参数
转发请求()
}
在实现forwardRequest的过程中,我尝试使用restTemplate并设置所有属性并进行exchange()调用。然而,我认为必须有一种更好的方法来按原样转发请求,而不必使用RestTemplate手工制作请求。
有什么建议吗?

我想你忽略了一个事实,那就是有一个叫做
HandlerInterceptor
的概念

步骤1:

public class ValidationInterceptor extends HandlerInterceptorAdapter {
  private static final Log logger = LogFactory.getLog(ValidationInterceptor.class);
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
    // validate headers
   // validate body
   // validate URL parameters
   // validate query parameters
    return true;//forwardRequest(); False will break the chain.
  }
}
步骤2:

@Configuration
public class InterceptorsConfig implements WebMvcConfigurer {

  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new ValidationInterceptor())
    .addPathPatterns("/*", "/*.html");//Add as many as patterns you want this validator to be called!
  }
}

我知道有拦截器。这仍然不能解决在不手工制作整个HTTP请求的情况下将请求“转发”到上游系统的问题。请记住,上游系统位于不同的网络层,我将无法在上游应用程序中添加验证侦听器。您的意思是说您正在代理请求吗?是的,基于验证,我必须拒绝或转发/代理请求。您找到解决方案了吗?看看netflix的Zuul