如何将ServletListener限制为单个上下文?

时间:2016-09-22 16:23:53

标签: java servlets glassfish jetty servlet-listeners

我有一个JSR-356 WebSocket应用程序。我使用监听器对其进行初始化,因此我不需要依赖jar扫描进行注释,这会减慢启动速度。

例如,我使用注册WebSocket ServletContextListener的{​​{1}}实现:

EndPoint

然后在web.xml部署描述符中注册该侦听器:

@Override
public void contextInitialized(ServletContextEvent sce) {

    ServerContainer serverContainer = (ServerContainer) sce
        .getServletContext()
        .getAttribute("javax.websocket.server.ServerContainer");

    serverContainer.addEndpoint(MyEndPoint.class);
}

问题是现在EndPoint已经注册了所有的Web上下文,这不是我想要的。

如何将监听器限制为特定的上下文?或者设置" init params"在侦听器上通过配置我可以在我的ServletContextListener中检查并仅在它与某个init参数匹配时注册EndPoint?

2 个答案:

答案 0 :(得分:1)

每个webapp都是它自己的MGCopyAnswer_internal,单个servlet监听器无法响应多个这样的webapp上下文。

在你的情况下还有其他事情发生。

答案 1 :(得分:0)

Web应用程序只有两种情况 Global称为应用程序上下文,可以访问整个Web应用程序。而另一个是 Servlet配置,这只能由特定的servlet访问。

如果要将侦听器限制为特定上下文,则应将servlet的init-params(即Servlet Config)用于特定的servlet。

<servlet>
<description>This is config servlet</description>
<servlet-name>ConfigContext</servlet-name>
<servlet-class>com.configcontext.ConfigContext</servlet-class>
<init-param>
  <param-name>javax.websocket.server.ServerContainer</param-name>
  <param-value>servlet container</param-value>
</init-param>
</servlet>
<servlet-mapping>
  <servlet-name>ConfigContext</servlet-name>
  <url-pattern>/ConfigContext</url-pattern>
</servlet-mapping>

每个servlet都有自己的servlet配置,所以你必须添加init-param&#34; javax.websocket.server.ServerContainer&#34;所有那些你想要限制的servlet