为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Spring Webflux中获取当前控制器方法的URL?

如何在Spring Webflux中获取当前控制器方法的URL?

梵蒂冈之花 2022-08-17 16:00:02
这个问题类似于在Spring MVC中获取当前URL的最佳方法是什么?但对于Webflux(它也可能与如何在spring-webflux中获取当前请求的上下文有关,但这个问题更具体,所以我希望有一个解决方案)。我想做的是在Webflux控制器中获取当前URL。例如:@GetMapping("/greeting")public Mono<Greeting> greeting() {   String linkToCurrentResource = .. // How do I get this?   Greeting greeting = new Greeting("hello",  linkToCurrentResource);   return Mono.just(greeting);}如果运行在负载均衡器后面,最好应了解标头。因此,在这种情况下,我想成为类似.如果这很重要,我正在使用Netty服务器实现。linkToCurrentResourceX-Forwarded-???linkToCurrentResourcehttps://external-uri.com/api/greeting
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您可以使用 ServerHttpRequest 作为方法参数来获取 :uri


@RestController

public class GreetingController {

  @GetMapping("/greeting")

  public Mono<Greeting> getGreeting(ServerHttpRequest serverHttpRequest) {

    return Mono.just(new Greeting("greeting", serverHttpRequest.getURI().toString()));

  }

}

如果运行在负载均衡器后面,最好应了解标头。linkToCurrentResourceX-Forwarded-???


然后,您可以公开转发标题变压器。@Bean


从其文档中:


从 “” 和 “” 标头中提取值以覆盖请求(即 ),以便它反映客户端发起的协议和地址。ForwardedX-Forwarded-*URIHttpRequest.getURI()


@Configuration

open class MvcConfig {

    @Bean

    open fun forwardedHeaderTransformer() = ForwardedHeaderTransformer()

}

以下是一些测试:


@ExtendWith(SpringExtension::class)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,

        properties = ["server.port=4333"])

class GreetingController2Test {

    @Autowired

    private lateinit var restTemplate: TestRestTemplate


    @Test

    fun `should return uri`() {

        val responseEntity = restTemplate.getForEntity("/greeting", Greeting::class.java)

        val greeting = responseEntity.body!!

        assertEquals("http://localhost:4333/greeting", greeting.uri)

    }


    @Test

    fun `should return uri composed from forwarded-??? headers`() {

        val headers = HttpHeaders()

        headers["X-Forwarded-Host"] = "external-uri.com"

        headers["X-Forwarded-Proto"] = "https"

        headers["X-Forwarded-Prefix"] = "/prefix"


        val httpEntity = HttpEntity(null, headers)

        val responseEntity = restTemplate.exchange("/greeting", HttpMethod.GET, httpEntity, Greeting::class.java)

        val greeting = responseEntity.body!!

        assertEquals("https://external-uri.com/prefix/greeting", greeting.uri)

    }

}

和 :Greeting.kt


data class Greeting(

        val g: String? = null,

        val uri: String? = null

)


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信