Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable servlet at build/package/deploy, enable at run-time?

Lets say I have a simple "Hello world" type servlet, configured with the annotation @WebServlet("/hello").

I want to disable it for build/deployment, so it will not be possible to "call" the servlet. How would I do that?

Then, through a configuration file, I want to be able to enable the servlet at run-time, so it can be used by a client. How would I do that?

Is either of these possible?

like image 752
Some programmer dude Avatar asked Dec 19 '22 09:12

Some programmer dude


1 Answers

You can't enable servlets during runtime via standard API. It can at most only be enabled during build time in web.xml or during deploy time by ServletContext#addServlet(). Your best bet is to always enable it and control it on a per-request basis. You can use a servlet filter for this.

First give the servlet a name.

@WebServlet(urlPatterns="/hello", name="yourServlet")
public class YourServlet extends HttpServlet {
    // ...
}

So that you can easily map a filter directly to it without worrying about servlet's URL patterns.

@WebFilter(servletNames="yourServlet")
public class YourFilter implements Filter {
    // ...
}

In your filter, just decide whether to continue the chain, or to return a 404 based on your configuration file setting.

@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);
    }
}

The isYourConfigurationFileSettingSet() part can't be answered in detail based on the information provided so far. In case you actually also couldn't figure out that, then head to Where to place and how to read configuration resource files in servlet based application?

like image 110
BalusC Avatar answered Feb 05 '23 04:02

BalusC