可以说我有一个简单的“Hello world”类型的servlet,配置了注释@WebServlet("/hello")
。在build/package/deploy中禁用servlet,在运行时启用?
我想禁用它的构建/部署,所以它不可能“调用”该servlet。我会怎么做?
然后,通过一个配置文件,我希望能够在运行时使servlet的,因此它可以被客户端使用。我会怎么做?
是这些可能吗?
可以说我有一个简单的“Hello world”类型的servlet,配置了注释@WebServlet("/hello")
。在build/package/deploy中禁用servlet,在运行时启用?
我想禁用它的构建/部署,所以它不可能“调用”该servlet。我会怎么做?
然后,通过一个配置文件,我希望能够在运行时使servlet的,因此它可以被客户端使用。我会怎么做?
是这些可能吗?
您无法在运行时通过标准API启用servlet。它最多只能在编译时间web.xml
或部署时间期间由ServletContext#addServlet()
启用。您最好的选择是始终启用它并根据每个请求进行控制。你可以用这个servlet filter。
首先给servlet一个名字。
@WebServlet(urlPatterns="/hello", name="yourServlet")
public class YourServlet extends HttpServlet {
// ...
}
因此,您可以轻松地将过滤器直接映射到它,而无需担心servlet的URL模式。
@WebFilter(servletNames="yourServlet")
public class YourFilter implements Filter {
// ...
}
在您的过滤器中,只需决定是继续链接还是根据您的配置文件设置返回404即可。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (isYourConfigurationFileSettingSet()) {
chain.doFilter(request, response);
} else {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
的isYourConfigurationFileSettingSet()
部分不能详细基于到目前为止所提供的信息来回答。如果你真的无法弄清楚,那么就去Where to place and how to read configuration resource files in servlet based application?
不是通过注释定义servlet,而是在web.xml文件中执行。此文件的不同版本可能允许您启用或不启用servlet。
要在构建和部署时选择要使用的web.xml版本。也许通过Maven配置文件或类似的。看看下面的链接有关的一些想法:https://maven.apache.org/guides/mini/guide-building-for-different-environments.html
如果你想要真正的运行时控制,那么你可能需要做一点自定义编码。一个过滤器(或者我猜想,servlet本身)可以检查一个属性的值并返回一个带有HTTP错误代码的响应(我想403会是模糊的; 404更不会这样,但是如果你想让它看起来像该servlet不存在于该配置中,它将工作...)
这绝对是我考虑过的一种可能性,但是因为在封装时很容易选择多个'web.xml'文件中的一个, WAR文件,但我不知道是否可以在运行时或如何进行选择。 –
@Someprogrammerdude请参阅我的编辑。 – Andres