2017-02-14 3 views
0

У меня есть приложение, которое использует Spring 4.3.5 и Spring mvc - apache.Spring Websockets не работает в контексте пользовательского контекста приложения

Я написал чат согласно этой статье https://spring.io/guides/gs/messaging-stomp-websocket/

Все работает правильно, если весь мой контекст приложения путь корень так, например: http://example.com/ я получаю следующие кадры в WebSocket

["SUBSCRIBE\nid:sub-0\ndestination:/chat-messages/TST\n\n\u0000"] 
["SEND\ndestination:/chat/message/TST\ncontent-length:52\n\n{\"message\":\"\",\"username\":\"USER\",\"event\":\"ONLINE\"}\u0000"] 
["MESSAGE\ndestination:/chat-messages/TST\ncontent-type:application/json;charset=UTF-8\nsubscription:sub-0\nmessage-id:x1jpjyes-1\ncontent-length:230\n\n{..SOME JSON CONTENT....}\u0000"] 

Проблема заключается в том, что он перестает работать, если я добавлю какой-либо контекст приложения (и мне нужно сделать это на моем сервере) например: http://example.com/my-app Нет сообщений , а также не отправлено

UPDATE: Никакой отправки не было установлено добавлением servletContext.getContextPath() в префиксы назначения.

С контексте, я получил только это:

["SUBSCRIBE\nid:sub-0\ndestination:/my-app/chat-messages/TST\n\n\u0000"] 
["SEND\ndestination:/my-app/chat/message/TST\ncontent-length:52\n\n{\"message\":\"\",\"username\":\"USER\",\"event\":\"ONLINE\"}\u0000"] 

Вот мои конфигурации:

@Configuration 
public class WebMvcConfig extends WebMvcConfigurationSupport { 
    private static final String TILES = "/WEB-INF/tiles/tiles.xml"; 
    private static final String VIEWS = "/WEB-INF/views/**/views.xml"; 
    private static final String RESOURCES_HANDLER = "/resources/"; 
    private static final String RESOURCES_LOCATION = RESOURCES_HANDLER + "**"; 

    @Override 
    public RequestMappingHandlerMapping requestMappingHandlerMapping() { 
     RequestMappingHandlerMapping requestMappingHandlerMapping = super 
      .requestMappingHandlerMapping(); 
     requestMappingHandlerMapping.setUseSuffixPatternMatch(false); 
     requestMappingHandlerMapping.setUseTrailingSlashMatch(false); 
     return requestMappingHandlerMapping; 
     } 

    @Bean 
    public TilesViewResolver configureTilesViewResolver() { 
     return new TilesViewResolver(); 
    } 

    @Bean 
    public TilesConfigurer configureTilesConfigurer() { 
     TilesConfigurer configurer = new TilesConfigurer(); 
     configurer.setDefinitions(TILES, VIEWS); 
     return configurer; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler(RESOURCES_HANDLER).addResourceLocations(
       RESOURCES_LOCATION); 
    } 

    @Override 
    public void configureDefaultServletHandling(
     DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 
} 

WebSocketMesssageBroker

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{ 

    @Autowired 
    private ServletContext servletContext; 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/chat-messages"); 
     config.setApplicationDestinationPrefixes(servletContext.getContextPath() + "/chat"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/chat-websocket").withSockJS(); 
    } 
} 

И у меня есть контроллер обрабатывать все,

@MessageMapping("/message/{projectId}") 
@SendTo("/chat-messages/{projectId}") 
public ChatResponse sendMessage(@DestinationVariable String projectId, MessageSent message) throw InterruptedException { 

//Send reponse back like user online/offline or message posted 
return new ChatResponse(chatMessage); 

} 

В JSP файл я следующий JS называется

var socket = new SockJS('<c:url value="/chat-websocket/"/>'); 

stompClient.subscribe('<c:url value="/chat-messages/${chatProject.projectId}"/>', function (data) { ....SOME RESPONSE PROCESSING... }); 

stompClient.send("<c:url value="/chat/message/${chatProject.projectId}"/>", {}, JSON.stringify({.....PAYLOAD TO SEND ---})); 

и web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0"> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <error-page> 
     <exception-type>org.springframework.security.web.authentication.rememberme.CookieTheftException</exception-type> 
     <location>/signin</location> 
    </error-page> 
    <error-page> 
     <location>/generalError</location> 
    </error-page> 
    <error-page> 
     <error-code>404</error-code> 
     <location>/404</location> 
    </error-page> 
    <jsp-config> 
     <jsp-property-group> 
      <url-pattern>*.jsp</url-pattern> 
      <trim-directive-whitespaces>true</trim-directive-whitespaces> 
     </jsp-property-group> 
    </jsp-config> 
</web-app> 

Я подозреваю, что это может быть что-то с конфигурацией либо плитки или всего диспетчеру в web.xml или что-то вроде этого:/

Было бы очень greatfull намеков

+0

Я был в состоянии чтобы решить, что ничего не было отправлено контроллеру, добавив servletContext.getContextPath() в префиксы назначения. Но все же я не могу ничего получить через подписчика – Khobar

ответ

0

Я был в состоянии решить эту проблему.Оказывается, каждый раз, когда я создавал SockJS подписчик я должен пройти относительный путь, как пары, без какого-либо контекста

(я предполагаю базу WebSocket открыт URL уже есть правильный URL)

Так что для того, чтобы должным образом получить подписные события все Я должен был сделать изменения

stompClient.subscribe('<c:url value="/chat-messages/${chatProject.projectId}"/>', function (data) { ....SOME RESPONSE PROCESSING... }); 

к этому:

stompClient.subscribe('/chat-messages/${chatProject.projectId}', function (data) { ....SOME RESPONSE PROCESSING... }); 

(без < с: URL > который возвращающиеся контекстный путь все время)

Поэтому, когда я пытался подписаться на чат-сообщения, используя

<c:url value="chat-messages/ID">
на самом деле я с подпиской на:
my-app/chat-messages/ID
и мой контроллер и конфигурации Ожидал простой относительный чат -сообщений

Вот почему после добавления contextPath к WebSocketController setApplicationDestinationPrefixes, приложение начал посылать правильные сообщения

Те несколько часов, я не получаю обратно :)

Смежные вопросы