Как получить URL текущего метода контроллера в Spring Webflux?

По словам пользователя на сайте PHP.net , его попытки сохранить сеанс не удалось, поэтому ему пришлось сделать обходное решение.


В папке SessionData это будут сохранены текстовые файлы для хранения информации о сеансе, каждый файл будет иметь имя, похожее на «sess_a_big_hash_here».

1
задан Johan 18 March 2019 в 14:51
поделиться

1 ответ

Вы можете использовать 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
)
0
ответ дан caco3 18 March 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: