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

时间:2015-09-18 11:54:12

标签: java neo4j

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

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

一种解决方案 - 验证每个资源中的版本。但这种方法很混乱,导致代码重复。

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

这可能吗?如果是 - 那又怎么样?

1 个答案:

答案 0 :(得分:3)

这是可能的!

方法有点棘手和脆弱,但它正在工作(blog post)。

依赖

您需要BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream serializedResourceStream = new MemoryStream(serializedResource)) { object result = b.Deserialize(serializedResourceStream); } 依赖项,因为它包含访问Neo4j Web服务器所需的neo4j-server

所以,请添加到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() {} }
  • 获取网络服务器
  • 将过滤器添加到Web服务器

代码:

SPIPluginLifecycle

棘手的部分不是那么“合法”访问Web服务器。这可能在将来破裂,所以要小心。

注意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()