当前位置: 首页 > 知识库问答 >
问题:

无描述符的servlet容器在servlet 3中作为过滤器运行。x容器

刁瀚昂
2023-03-14

有没有办法以javax的形式运行Jersey servlet容器(2.x)描述符。servlet。在Servlet 3中筛选。x容器?我需要在提供服务的同时提供静态资源,因此需要使用jersey。配置。servlet。滤器forwardOn404泽西。配置。servlet。滤器staticContentRegex仅在根据Javadoc作为过滤器运行时工作

该属性仅在Jersey servlet容器配置为作为javax运行时适用。servlet。筛选,否则将忽略此属性。

我想彻底摆脱web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <display-name>My-Webservice</display-name>

    <filter>
        <filter-name>Jersey Filter</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.foo.webservices.MyApplication</param-value>
        </init-param>
    </filter>
</web-app>

并且在我的定制应用程序类中拥有所有内容

@ApplicationPath(value = "/")
public class MyApplication extends ResourceConfig
{    
    public MyApplication()
    {
        packages("com.foo.webservices.services");
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}

不幸的是,官方留档(https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.3)没有说明任何关于过滤器的事情。

共有1个答案

王磊
2023-03-14

这是可能的,但不会像设置一些配置属性那么简单。如果你能稍微了解一下它的实际工作原理,这会有所帮助。使用Servlet 3。x、 介绍了一个ServletContainerInitializer,我们可以实现它来动态加载Servlet(这里将进一步讨论)。Jersey有一个它使用的实现。但它遵循了JAX-RS,即应用程序应作为servlet加载。所以泽西没有提供任何解决方法。

我们可以编写自己的SerletContainerInitializer,也可以直接使用Jersey的。Jersey有一个SerletContainerProvider我们可以实现。我们需要自己注册servlet过滤器。实现看起来像这样

@Override
public void preInit(ServletContext context, Set<Class<?>> classes) throws ServletException {
    final Class<? extends Application> applicationCls = getApplicationClass(classes);
    if (applicationCls != null) {
        final ApplicationPath appPath = applicationCls.getAnnotation(ApplicationPath.class);
        if (appPath == null) {
            LOGGER.warning("Application class is not annotated with ApplicationPath");
            return;
        }
        final String mapping = createMappingPath(appPath);
        addFilter(context, applicationCls, classes, mapping);
        // to stop Jersey servlet initializer from trying to register another servlet
        classes.remove(applicationCls);
    }
}

private static void addFilter(ServletContext context, Class<? extends Application> cls,
                              Set<Class<?>> classes, String mapping) {
    final ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(cls, classes);
    final ServletContainer filter = new ServletContainer(resourceConfig);
    final FilterRegistration.Dynamic registration = context.addFilter(cls.getName(), filter);
    registration.addMappingForUrlPatterns(null, true, mapping);
    registration.setAsyncSupported(true);
}

一旦我们有了实现,我们需要创建一个文件

META-INF/services/org.glassfish.jersey.servlet.internal.spi.ServletContainerProvider

它应该位于类路径的根。该文件的内容应该是我们实现的完全限定名称。

你可以在这个GitHub回购中看到一个完整的例子

 类似资料:
  • 主要内容:Web 服务器,Web 容器您可能已经知道,部署动态网站一般需要 Web 服务器的支持,例如: 运行 PHP 网站一般选择 Apache 或者 Nginx; 运行 ASP/ASP.NET 网站一般选择 IIS; 运行 Python 网站一般选择内置的 WSGI 服务器模块——wsgiref。 Web 服务器是一种对外提供 Web 服务的软件,它可以接收浏览器的 HTTP 请求,并将处理结果返回给浏览器。 在部署 Servle

  • 我们知道,每当对 servlet 的请求出现时,servlet 容器将首先检查 web.xml 文件中的 url 和相应的 servlet 类。这很好,但混乱在那之后就来了。假设我正在使用启动时加载属性。因此,在第一个调用进入之前,servlet 应该准备就绪。在这种情况下,容器需要 servlet Config 对象来使 servlet 正常工作。但是,servlet 的启动加载和 init 参

  • 我将在一个已经存在的网站中介绍Spring Web Security。现在出现了一个问题: 我希望我的自定义筛选器在Spring Security筛选器链之前在Tomcat筛选器链中执行。我不想让他们成为这个Spring安全过滤器链的一部分。 我所找到的只是Spring Boot中的一个解决方案(请参见“Spring-How to insert a filter before SpringSecu

  • 问题内容: 我从dockerfile构建了Docker映像。我看到映像已成功构建,但是该如何处理?它不应该能够作为容器运行吗? 问题答案: 运行它的具体方法取决于您是否为图像指定了标签/名称。 使用名称(让我们使用 Ubuntu ): 没有名称,只需使用ID: 请参阅 Docker运行参考 以获取更多信息。

  • 我有一个在主机上运行的docker容器,它是通过标准的“docker run…”命令启动的。它运行的网络是“directory_default”的默认名称,其中“director”是当前目录的名称。 我还有一个docker compose文件(在同一台主机上),它包含另一个容器定义,需要访问已经运行的容器。然而,当运行撰写文件时,我总是看到一个错误,指出网络无法访问。 读取无法链接到由docker

  • 使用Xvfb在LXD容器(ubuntu: 16.04)内运行GUI应用程序并在容器内执行以下命令很容易: 我的目标是在不登录的情况下执行上述命令,并在启动容器时自动执行(lxc start)。 我试图在“/etc/init.d/myscript”中创建一个脚本,并使其可执行。但没有机会,它没有工作(链接)。 另外,当我尝试执行