Jetty : Dynamically removing the registered servlet

后端 未结 1 561
南方客
南方客 2021-01-05 15:11

I created and started jetty server with WebAppContext. I can also add servlet to the WebAppContext with addServlet method. But I want to dynamically remove this servlet. Ho

相关标签:
1条回答
  • 2021-01-05 15:58

    You need to do it manually (there probably should be a convenience method, but there isn't)

    In Jetty 7 it would be something like (untested):

    public void removeServlets(WebAppContext webAppContext, Class<?> servlet)
    {
       ServletHandler handler = webAppContext.getServletHandler();
    
       /* A list of all the servlets that don't implement the class 'servlet',
          (i.e. They should be kept in the context */
       List<ServletHolder> servlets = new ArrayList<ServletHolder>();
    
       /* The names all the servlets that we remove so we can drop the mappings too */
       Set<String> names = new HashSet<String>();
    
       for( ServletHolder holder : handler.getServlets() )
       {
          /* If it is the class we want to remove, then just keep track of its name */
          if(servlet.isInstance(holder.getServlet()))
          {
              names.add(holder.getName());
          }
          else /* We keep it */
          {
              servlets.add(holder);
          }
       }
    
       List<ServletMapping> mappings = new ArrayList<ServletMapping>();
    
       for( ServletMapping mapping : handler.getServletMappings() )
       {
          /* Only keep the mappings that didn't point to one of the servlets we removed */
          if(!names.contains(mapping.getServletName()))
          {
              mappings.add(mapping);
          }
       }
    
       /* Set the new configuration for the mappings and the servlets */
       handler.setServletMappings( mappings.toArray(new ServletMapping[0]) );
       handler.setServlets( servlets.toArray(new ServletHolder[0]) );
    
    }
    
    0 讨论(0)
提交回复
热议问题