我有一个JSR-356WebSocket应用程序。我使用侦听器来初始化它,这样我就不需要依赖jar扫描来查找注释,这会减慢启动速度。
例如,我使用一个注册WebSocket的EndPoint的ServletContextListener实现
@Override
public void contextInitialized(ServletContextEvent sce) {
ServerContainer serverContainer = (ServerContainer) sce
.getServletContext()
.getAttribute("javax.websocket.server.ServerContainer");
serverContainer.addEndpoint(MyEndPoint.class);
}然后在web.xml部署描述符中注册该侦听器:
<listener>
<listener-class>my.ServletContextListenerImpl</listener-class>
</listener>问题是现在EndPoint已经为所有的网络上下文注册了,这不是我想要的。
如何将监听器限制在特定的上下文中?或者通过配置在侦听器上设置"init params“,然后我可以在我的ServletContextListener中检查并注册EndPoint,前提是它与某个初始化参数匹配?
发布于 2016-09-23 01:58:27
每个webapp都有自己的ServletContext,不可能让一个servlet侦听器像那样响应多个webapp上下文。
在你的情况下发生了一些其他的事情。
发布于 2016-09-23 02:22:37
web应用程序只有两个上下文。
一个是全局的,称为应用程序上下文,它是整个web应用程序都可以访问的。另一个是Servlet配置,这只能由特定的servlet访问。
当您想要将侦听器限制到特定的上下文时,那么您应该对特定的servlet使用Servlet的init-params (即Servlet Config)。
<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配置,因此必须将初始参数"javax.websocket.server.ServerContainer“添加到所有要限制的servlet
https://stackoverflow.com/questions/39644206
复制相似问题