【问题标题】:Jetty: How to configure DoSFilter parameters using JMXJetty:如何使用 JMX 配置 DoSFilter 参数
【发布时间】:2014-05-16 02:00:50
【问题描述】:

我已经为我的 webapp 设置了 DoSFilter 并将其部署在 Jetty 中。事情进展顺利。但是我偶尔想更改过滤器配置。为此,我总是必须更改 web.xml 并重新部署 webapps,这很不方便。我想改为动态地执行此操作。

我了解到我可以使用 JMX 配置 QoSFilter 和 DoSFilter,因为它们在 Jetty 中作为 MBean 公开。我在做同样的事情时遇到了麻烦。

到目前为止,我已经能够做到以下几点:

  1. 配置码头以启用 jmx 和 jmxremote。我成功地使用 jconsole 连接到 jetty jvm。
  2. 在我的部署描述符中,我有一个过滤器定义如下

<filter> <filter-name>DoSFilter</filter-name> <filter-class>org.eclipse.jetty.servlets.DoSFilter</filter-class> <init-param> <param-name>maxRequestsPerSec</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>requestPort</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>maxRequestMs</param-name> <param-value>600000</param-value> </init-param> <init-param> <param-name>excludePatterns</param-name> <param-value>/healthCheck</param-value> </init-param> <init-param> <param-name>managedAttr</param-name> <param-value>true</param-value> </init-param> </filter>

managedAttr 参数设置为 true,以便将此过滤器添加到 ServletContext,从而将其公开为 MBean。

3 我还添加了一个上下文参数,要求码头将 DoSFilter 设为 MBean,如下所示

<context-param> <param-name>org.eclipse.jetty.server.context.ManagedAttributes</param-name> <param-value>DoSFilter</param-value> </context-param>

现在这可行,但不是我想要的方式。当我打开 Jconsole 并转到 MBeans 选项卡时,我可以在 org.eclipse.jetty.servlets.DoSFilter 下看到 DoSFilter。

但是,当我向下移动树时,我只能看到该 MBean 的元数据信息。该 MBean 没有附加任何属性或操作,我无法更改任何内容。

请指教。我在这里做错什么了吗?

我的 webapp 是一个 spring 应用程序,只定义了一个 servlet

<servlet> <servlet-name>capture</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

谢谢

更新:我尝试在 Embedded Jetty 中进行配置,一切似乎都很好。但我仍然无法让它在独立部署中工作。

以下是我测试嵌入式服务器的方式

public static void main(String[] args) throws Exception {
        Server server = new Server();
        Connector connector = new ServerConnector(server);
        server.addConnector(connector);
        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        MBeanContainer mbeanContainer = new MBeanContainer(mbeanServer);
        server.addBean(mbeanContainer);

  WebAppContext context = new WebAppContext(server,"/home/neo/ideaprojects/helloworld/src/main/webapp/", "/");


        DoSFilter filter = new DoSFilter();
        FilterHolder holder = new FilterHolder(filter);
        String name = "DosFilter";
        holder.setName(name);
        holder.setInitParameter("managedAttr", "true");

        context.setInitParameter(ServletContextHandler.MANAGED_ATTRIBUTES, name);
        context.addFilter(holder, "/*", EnumSet.of(DispatcherType.FORWARD));
        // ----------------------------------------

        server.start();
        server.join();
    }

更新

I see the following debug logs in jetty standalone mode
2014-04-05 20:18:32.834:DBUG:oejj.MBeanContainer:main: beanAdded o.e.j.w.WebAppContext@ace3c1b{/,file:/tmp/jetty-0.0.0.0-8080-ROOT.war-_-any-6506776307143437350.dir/webapp/,STARTING}{/ROOT.war}->org.eclipse.jetty.servlets.DoSFilter@6d4d63ba
2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: ObjectMbean: mbeanFor org.eclipse.jetty.servlets.DoSFilter@6d4d63ba mClass=class org.eclipse.jetty.jmx.ObjectMBean
2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: mbeanFor org.eclipse.jetty.servlets.DoSFilter@6d4d63ba is org.eclipse.jetty.jmx.ObjectMBean@34bb5def
2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: No MBean Influence for DoSFilter
2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: No MBean Influence for Object
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: No MBean Influence for Filter
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influence Count: 3
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: No @ManagedObject declared on class org.eclipse.jetty.servlets.DoSFilter
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: org.eclipse.jetty.servlets.DoSFilter
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: org.eclipse.jetty.servlets.DoSFilter
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: java.lang.Object
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: java.lang.Object
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: javax.servlet.Filter
2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: javax.servlet.Filter
2014-04-05 20:18:32.836:DBUG:oejj.MBeanContainer:main: Registered org.eclipse.jetty.servlets:context=ROOT,type=dosfilter,id=0

【问题讨论】:

    标签: java jetty jmx servlet-filters managed-bean


    【解决方案1】:

    我发现了问题。问题出在我相信的罐子上。我扩展了 DOSFilter 以在检查之前替换一些标题,因此我必须在我的 webapp 中包含 servlets jar。我的 WEB-INF/lib 文件夹中还有一大堆其他的 jetty-*.jar(用于其他一些调试目的),它们以某种方式造成了冲突。 webapp 是一个 maven 项目,所以我在我的 webapp 中添加了所有基于 jetty 的模块,这样这些 jars 就不会被打包到我的可部署战争中。这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-07-05
      • 2015-06-12
      • 1970-01-01
      相关资源
      最近更新 更多