我有一个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?
答案 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