Webflux的上下文路径

时间:2018-03-09 14:54:17

标签: spring-webflux

我一直在努力寻找一种为webflux应用程序设置上下文路径的方法。我知道我可以使用

配置它
server.servlet.context-path

如果我部署一个servlet,但我想用webflux实现它,而不必显式添加每个路由的路径或使用MVC。

10 个答案:

答案 0 :(得分:13)

根据this

属性名称中有 servlet ,应为 提示不适用于webflux。

使用springboot v2.3,您可以将其放入属性文件中

spring.webflux.base-path=/your-path

发行说明参考:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#configurable-base-path-for-webflux-applications

答案 1 :(得分:5)

您可以使用Web过滤器使WebFlux支持contextPath

@Bean
public WebFilter contextPathWebFilter() {
    String contextPath = serverProperties.getServlet().getContextPath();
    return (exchange, chain) -> {
        ServerHttpRequest request = exchange.getRequest();
        if (request.getURI().getPath().startsWith(contextPath)) {
            return chain.filter(
                exchange.mutate()
                .request(request.mutate().contextPath(contextPath).build())
                .build());
        }
        return chain.filter(exchange);
    };
}

答案 2 :(得分:3)

对于Undertow,我设法通过创建自定义的UndertowReactiveWebServerFactory来添加上下文路径:

 @Bean
public UndertowReactiveWebServerFactory undertowReactiveWebServerFactory(
        @Value("${server.servlet.context-path}") String contextPath) {
    return new UndertowReactiveWebServerFactory() {
        @Override
        public WebServer getWebServer(HttpHandler httpHandler) {
            Map<String, HttpHandler> handlerMap = new HashMap<>();
            handlerMap.put(contextPath, httpHandler);
            return super.getWebServer(new ContextPathCompositeHandler(handlerMap));
        }
    };
}

答案 3 :(得分:2)

这是我用Tomcat Reactive做的方式:

@Configuration
public class TomcatReactiveWebServerConfig extends TomcatReactiveWebServerFactory {

    @Value("${server.servlet.context-path}")
    private String contextPath;

    /**
     * {@inheritDoc}
     */
    @Override
    protected void configureContext(final Context context) {

        super.configureContext(context);

        if (StringUtils.isNotBlank(this.contextPath)) {
            context.setPath(this.contextPath);
        }
    }
}

答案 4 :(得分:1)

您可以使用Web过滤器,如上面的答案所述,但是您还可以做一件事。编写一个基本控制器,并将每个类扩展到该基本控制器。 例如:

Base Controller.java

@RestController
@RequestMapping("/{base_url}")
public abstract class BaseController {
}

NewController.java

@RestController
public class NewController extends BaseController{
  @Autowired
  DatabaseClient databaseClient;

  @GetMapping("/status")
  public Mono<Map<String, String>> status() {
    return databaseClient.execute("SELECT 'ok'").
      map(row -> singletonMap("status", row.get(0, String.class)))
      .one();
  }
}

所以现在您可以点击/ {base_url} / status

答案 5 :(得分:1)

我在 spring.webflux.base-path 中遇到了与 webflux-reactive-spring-web 类似的问题(似乎没有按预期工作),我意识到我禁用了自动配置。

手动解决方法是:

@Bean
public WebFluxProperties webFluxProperties(){
    return new WebFluxProperties();
}

答案 6 :(得分:0)

如果您自己配置服务器(如果您没有使用Spring Boot),则可以设置自己包装多个处理程序的a ContextPathCompositeHandler

如果您使用的是Spring Boot,则目前不支持此功能。

答案 7 :(得分:0)

我遇到了同样的问题,因为加载器平衡器基于上下文路径来路由到不同的后端应用程序。使用上下文路径来解决Spring Boot Webflux的一种方法是在@XXXXMapping注释中使用变量。例如@RequestMapping(value =&#34; $ {server.servlet.context-path} / subpath&#34;)

答案 8 :(得分:0)

对于WebFlux应用程序位于负载均衡器/代理后面的用例,您可以使用专用类-int main() { char sen[200],del[200],maybedel[200]; cout<<"enter sentence :"<<endl; cin.getline(sen,200); cout<<"which word do you want to delete ?"; cin.getline(del,200); int len = strlen(sen); for(int i=0;i<=len;i++) { if(sen[i]==' ') { for(int j=i;j<=len;j++) if(sen[j]==' ' || sen[j]=='\0') for(int k=i+1,t=0;k<j;k++,t++) maybedel[t]=sen[k]; if(maybedel==del) cout<<maybedel; } } return 0; } ,该类将从ForwardedHeaderTransformer中提取路径上下文并将其添加到X-Forwarded-Prefix中。

这样做,您无需修改​​全局ServerHttpRequest(在WebFlux中没有意义)

此处有更多相关信息:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-web-handler-api

答案 9 :(得分:0)

这里是一个基于@Dmytro Boichenko的评论,使用Netty服务器为WebFlux配置上下文路径的示例。您还可以包括定制程序来配置端口和其他属性。

DataTable