Я создаю образец веб-приложения, используя сервлеты Guice и веб-сокет в tomcat, теперь, когда используется фильтр guice, веб-сокет перестает работать
Основная информация:
В моем web.xml я инициализировал Guiceservlet, используя GuiceBasedListener
<web-app>
<listener>
<listener-class>test.GuiceBasedListener</listener-class>
</listener>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
GuieBasedListener
Код, который связывает все запросы /*
с MyDispatcher
public class GuiceBasedListener extends GuiceServletContextListener {
protected Injector getInjector() {
return Guice.createInjector( new ServletModule() {
@Override
protected void configureServlets() {
bind(MyDispatcher.class).asEagerSingleton();
serve("/*").with(MyDispatcher.class);//////IMPORTANT LINE//
}
});}}
MyDispatcher
код, который просто отвечает строкой
public class MyDispatcher extends HttpServlet {
@Inject private Injector injector;
public MyDispatcher() {}
public void service(ServletRequest req, ServletResponse resp) throws IOException, ServletException {
resp.getOutputStream().print("SUCCESS:" + req);
}
}
Также у меня есть @ServerEndPoint для Websocket
@ServerEndpoint(value = "/websocket/chat2")
public class WebSocket{
....
@OnOpen
public void start(Session session) {
System.out.println("Staring:"+this);
}
....
}
Наблюдения:
- Теперь, если я запущу приложение и нажму http://app:8080/test, оно вернет
SUCCESS
- Но если я попытаюсь подключиться к веб-сокету с помощью ws://app:8080/websocket/chat2, это не удастся.
Теперь, если я прокомментирую
serve("/*").with(MyDispatcher.class);
, в основном, если мы отключим маршрутизацию guice, веб-сокет начнет работатьЕсли я отключу guice-servlet, но добавлю отображение сервлета в web.xml, как показано ниже, websocket все еще работает
< servlet-mapping >
< servlet-name > HelloWorld< / servlet-name >
< url-pattern > /* < / url-pattern >
< / servlet-mapping >
Что я упускаю или делаю неправильно?
ИЗМЕНИТЬ:
Наблюдение-продолжение:
- Что я сделал, так это определил простой фильтр, который просто отвечает
FILTER
.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
response.getOutputStream().print("FILTER"); }
и изменил мой web.xml на
<web-app>
<filter>
<filter-name>myFilter</filter-name>
<filter-class>test.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Теперь, нажав http://localhost:8080/app/x
, вернитесь FILTER
, как и ожидалось. Но попытка подключения с помощью веб-сокета не удалась, поскольку запрос показывает что-то вроде этого. Я также заметил, что когда я изменяю строку MyFilter
, возвращаю длину содержимого в ответных изменениях, что означает, что запрос достиг MyFilter
до того, как tomcat обработал его для веб-сокета.
Я изменил web.xml на приведенный ниже, и теперь guice и websocket работают нормально.. поэтому я думаю, что Guice не соблюдает WsFilter, зарегистрированный после GuiceFilter.
<filter> <filter-name>myFilter</filter-name> <filter-class>org.apache.tomcat.websocket.server.WsFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <filter-mapping> <filter-name>guiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
TOMCAT 8.0, Window 7, Java 1.7, Guice 4.0, Guice-сервлет-4.0
GuiceFilter
есть просто ошибка и требуется простое исправление, но неясно, что именно, пока вы не уточните о фактически наблюдаемых симптомах. - person BalusC   schedule 30.05.2017