当前位置: 首页 > 知识库问答 >
问题:

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

毕富
2023-03-14
@GetMapping("/greeting")
public Mono<Greeting> greeting() {
   String linkToCurrentResource = .. // How do I get this?
   Greeting greeting = new Greeting("hello",  linkToCurrentResource);
   return Mono.just(greeting);
}

如果运行在负载均衡器之后,LinkToCurrentResource最好应该理解X-Forwarded-???头。因此,在本例中,我想让LinkToCurrentResource类似于https://external-uri.com/api/greeting。如果需要的话,我将使用Netty服务器实现。

共有1个答案

顾淳
2023-03-14

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

@RestController
public class GreetingController {
  @GetMapping("/greeting")
  public Mono<Greeting> getGreeting(ServerHttpRequest serverHttpRequest) {
    return Mono.just(new Greeting("greeting", serverHttpRequest.getURI().toString()));
  }
}

如果运行在负载均衡器之后,LinkToCurrentResource最好应该理解X-Forwarded-???头。

然后可以公开forwardedheadertransformer@bean

从“forwarded”和“x-forwarded-*”头中提取值,以覆盖请求URI(即HttpRequest.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
)
 类似资料:
  • 本文向大家介绍iOS如何获取当前View所在控制器的方法,包括了iOS如何获取当前View所在控制器的方法的使用技巧和注意事项,需要的朋友参考一下 前言 不知道大家有没有遇到过在做轮播图的时候,有点轮播图展示的是广告,有的是活动,等等还有其他的,当前点击某个轮播的时候要跳转到不同的控制器,点击事件是在控制器写的,为了避免控制器代码过多,显示的臃肿。我创建了一个UIWindow的分类,暂且叫Mode

  • 我正在开发一个Spring应用程序,并在HandlerInterceptorAdapter的预处理()方法中对用户进行身份验证,如果用户进行了身份验证,我将如下设置请求属性: 如果用户未通过身份验证,我是这样设置的 然后在稍后的控制器方法中,我用HttpServletRequest检索用户,如下所示: 问题是我需要在每个控制器方法中接收HttpServletRequest,以检查用户是否经过身份验

  • 问题内容: 我有一个externalItems列表。在每个externalItem内,我都有一个innerItems列表。它们是动态排序的。 当鼠标光标指向innerItems之一时,我必须在该innerItem元素上方显示弹出窗口。 Popup div是body的孩子,因为我不想为innerItems的每个单独创建一个弹出窗口。 我所看到的方式—在我调用的函数中,将左/上属性设置为绝对定位的弹出

  • 问题内容: 我用来发出几个http请求(显然)。现在,我需要发出请求并从最终URL中提取一些查询字符串(存在重定向)。 因此,问题是如何找到URL(如果重定向了客户端,则为最终URL)?Response中没有这样的字段。 请注意,我不需要停止重定向…仅在请求后查找URL是什么 问题答案: 您将回调添加到 然后,您可以在发生新请求时对其进行检查。只要确保设置某种限制来防止重定向循环(如文档中所述,默

  • 本文向大家介绍Asp.net MVC中获取控制器的名称的方法,包括了Asp.net MVC中获取控制器的名称的方法的使用技巧和注意事项,需要的朋友参考一下 1、视图中   2、控制器的action中 3、过滤器中   比如在ActionFilterAttribute中,这个时候一般是自己实现一个继承类,然后重写相关的方法。   在重写的方法中如果需要控制器的名称。 4、公共方法中 以上所述是小编给

  • 本文向大家介绍jsp中获取当前目录的方法,包括了jsp中获取当前目录的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jsp中获取当前目录的实现方法,分享给大家供大家参考。具体实现方法如下: 1、利用System.getProperty()函数获取当前路径: 2、使用File提供的函数获取当前路径: File.getCanonicalPath()和File.getAbsolutePat