Neo4j unmanaged extension - add custom request Filter to web server

眉间皱痕 提交于 2019-12-12 14:21:37

问题


We have unmanaged extension. We implemented custom communication API between server and client.

Now we need to ensure that client and server have same API version.

One solution - verify version in each resource. But this approach is messy and leads to code duplication.

What we want is to implement our own Filter and add it to Neo server.

Is this possible? If yes - then how?


回答1:


This is possible!

Approach is a bit tricky and fragile, but it's working (blog post).

Dependency

You need neo4j-server dependency, because it contains SPIPluginLifecycle that is needed to get access to Neo4j web server.

So, add to your pom.xml:

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

Filter

Create your filter. Let's take this one for example:

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() {}
}

This filter doesn't do anything usefull - just continue chain further.

Lifecycle plugin

Now tricky part. We need to:

  • Implement SPIPluginLifecycle
  • Get web server
  • Add filter to web server

Code:

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/*");
    }
}

Tricky part is not so "legal" access to web server. This can break in future, so be carefull.

Note addFilters() and removeFilters() methods - this is why we have been done all this way.

Important: lifecycle plugin should be registered as service:

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


来源:https://stackoverflow.com/questions/32651420/neo4j-unmanaged-extension-add-custom-request-filter-to-web-server

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!