gpt4 book ai didi

java - Neo4j 非托管扩展 - 将自定义请求过滤器添加到 Web 服务器

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:17 28 4
gpt4 key购买 nike

我们有非托管扩展。我们在服务器和客户端之间实现了自定义通信 API。

现在我们需要确保客户端和服务器具有相同的 API 版本。

一个解决方案 - 验证每个资源中的版本。但是这种方法很麻烦,并且会导致代码重复。

我们想要的是实现我们自己的Filter并将其添加到 Neo 服务器。

这可能吗?如果是 - 那么如何?

最佳答案

这是可能的!

方法有点棘手和脆弱,但它是有效的(blog post)。

依赖

您需要 neo4j-server 依赖项,因为它包含访问 Neo4j 网络服务器所需的 SPIPluginLifecycle

因此,添加到您的 pom.xml:

<dependency>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
<version>${version.neo4j}</version>
</dependency>

过滤器

创建您的过滤器。让我们以这个为例:

public class CustomFilter implements Filter {

public CustomFilter() {
}

@Override
public void init(final FilterConfig filterConfig) throws ServletException {}

@Override
public void doFilter(final ServletRequest request,
final ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}

@Override
public void destroy() {}
}

这个过滤器没有做任何有用的事情 - 只是继续进一步链。

生命周期插件

现在是棘手的部分。我们需要:

  • 实现SPIPluginLifecycle
  • 获取网络服务器
  • 向网络服务器添加过滤器

代码:

public final class ExtensionPluginLifecycle implements SPIPluginLifecycle {

private WebServer webServer;
private CustomFilter customFilter;

@Override
public Collection<Injectable<?>> start(final NeoServer neoServer) {
webServer = getWebServer(neoServer);

addFilters();
}

@Override
public void stop() {
removeFilters();
}

@Override
public Collection<Injectable<?>> start(final GraphDatabaseService graphDatabaseService,
final Configuration config) {
throw new IllegalAccessError();
}

private WebServer getWebServer(final NeoServer neoServer) {
if (neoServer instanceof AbstractNeoServer) {
return ((AbstractNeoServer) neoServer).getWebServer();
}
throw new IllegalArgumentException(String.format("Expected: [AbstractNeoServer], Received: [%s].", neoServer));
}

private void addFilters() {
customFilter = new CustomFilter();
webServer.addFilter(customFilter, "/extension-path/*");
}

private void removeFilters() {
webServer.removeFilter(customFilter, "/extension-path/*");
}
}

棘手的部分不是对网络服务器的“合法”访问。这可能会在未来崩溃,所以要小心。

请注意 addFilters()removeFilters() 方法 - 这就是我们这样做的原因。

重要:生命周期插件应该注册为服务:

// file: META-INF/services/org.neo4j.server.plugins.PluginLifecycle
my.company.extension.ExtensionPluginLifecycle

关于java - Neo4j 非托管扩展 - 将自定义请求过滤器添加到 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com