2016-07-27 53 views
0

我正在使用Spring 4應用程序(不幸的是不是Spring Boot),我無法使Web套接字正常工作。有一個簡單的TextWebSocketHandler實現,我在/ws路徑註冊,和我做得到確認日誌:向現有的Spring應用程序添加網絡套接字支持

映射的URL路徑[/ WS]到類型 [類 org.springframework.web.socket的處理程序.server.support.WebSocketHttpRequestHandler]

...但我無法連接網絡瀏覽器中的地址。我已經試過這基於註解的配置:

@Slf4j 
@Configuration 
@EnableWebSocket 
public class WebSocketConfiguration implements WebSocketConfigurer { 
    public static final String WEB_SOCKET_PATH = "/ws"; 
    @Autowired 
    private WebSocketService handler; 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     log.info("Registering web socket handler {} at '{}'.", handler, WEB_SOCKET_PATH); 
     registry.addHandler(handler, WEB_SOCKET_PATH); 
    } 
} 

我可以證實,WebSocketService handler不爲空,實際上實現了WebSocketHandler接口。雖然配置者顯然被觸發,連接與"ws://localhost:8081/ws"導致錯誤:

WebSocket連接到 'WS://本地主機:8081/WS' 失敗:錯誤時 WebSocket的握手:意外的響應代碼:404

錯誤{目標:網頁套接字,isTrusted:真,currentTarget當前:網頁套接字, 的EventPhase:2,氣泡:假的,或取消:假,defaultPrevented: 假,時間戳:1469616712980247,originalTarget:網頁套接字, explicitOriginalTarget:網頁套接字,NONE:0}

,我使用來測試網絡套接字機制的客戶端代碼是非常簡單的:

var ws = new WebSocket("ws://localhost:8081/ws"); 
ws.onerror = function(e) { console.log(e); } 
ws.onopen = function() { console.log("Opened"); } 

我甚至嘗試通過註冊XML配置的處理器,但是當我得到幾乎相同的日誌,它仍然不起作用。請注意,我使用幾乎默認配置的Jetty 9(通過Gretty Gradle插件)運行應用程序。

當通過春調試日誌去,我只能猜測,春促進HTTP請求到web套接字連接失敗:

13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 1 of 13 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: '[email protected]90548c: Authentication: org.springframew[email protected]4190548c: Principal: [email protected]: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]12afc: RemoteIpAddress: 127.0.0.1; SessionId: 1om9yxo93cwce1qb1tu0rcs15n; Granted Authorities: ROLE_USER' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 2 of 13 in additional filter chain; firing Filter: 'ConcurrentSessionFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 3 of 13 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 4 of 13 in additional filter chain; firing Filter: 'HeaderWriterFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 5 of 13 in additional filter chain; firing Filter: 'LogoutFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - Checking match of request : '/ws'; against '/logout' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 6 of 13 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - Request 'GET /ws' doesn't match 'POST /securityCheck 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 7 of 13 in additional filter chain; firing Filter: 'BasicAuthenticationFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 8 of 13 in additional filter chain; firing Filter: 'RequestCacheAwareFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 9 of 13 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 10 of 13 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - SecurityContextHolder not populated with anonymous token, as it already contained: 'org.springframew[email protected]4190548c: Principal: [email protected]: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]12afc: RemoteIpAddress: 127.0.0.1; SessionId: 1om9yxo93cwce1qb1tu0rcs15n; Granted Authorities: ROLE_USER' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 11 of 13 in additional filter chain; firing Filter: 'SessionManagementFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 12 of 13 in additional filter chain; firing Filter: 'ExceptionTranslationFilter' 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws at position 13 of 13 in additional filter chain; firing Filter: 'FilterSecurityInterceptor' 
13:14:02.322 [qtp1305935114-14] DEBUG - Checking match of request : '/ws'; against '/login*' 
13:14:02.322 [qtp1305935114-14] DEBUG - Secure object: FilterInvocation: URL: /ws; Attributes: [ROLE_USER] 
13:14:02.322 [qtp1305935114-14] DEBUG - Previously Authenticated: org.springframew[email protected]4190548c: Principal: [email protected]: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]12afc: RemoteIpAddress: 127.0.0.1; SessionId: 1om9yxo93cwce1qb1tu0rcs15n; Granted Authorities: ROLE_USER 
13:14:02.322 [qtp1305935114-14] DEBUG - Voter: [email protected], returned: 1 
13:14:02.322 [qtp1305935114-14] DEBUG - Authorization successful 
13:14:02.322 [qtp1305935114-14] DEBUG - RunAsManager did not change Authentication object 
13:14:02.322 [qtp1305935114-14] DEBUG - /ws reached end of additional filter chain; proceeding with original chain 
13:14:02.323 [qtp1305935114-14] DEBUG - Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]425f619f 
13:14:02.324 [qtp1305935114-14] DEBUG - Chain processed normally 
13:14:02.324 [qtp1305935114-14] DEBUG - SecurityContextHolder now cleared, as request processing completed 

已經通過官方文檔和示例看着,似乎在網絡插座配置非常標準。是否有我可能錯過的任何配置,或者我可能必須更改以在Spring中啓用Web套接字的配置?

回答

1

原來網絡套接字和預期一樣,但春天的servlet映射未在web.xml設置爲/*

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/spring/*</url-pattern> 
</servlet-mapping> 

這是愚蠢的,真的 - 我不得不做的是改變地址ws://localhost:8081/spring/ws 。我忽略了一些事實,即一些Spring過濾器被映射到/*,我的印象是Spring servlet共享這個映射 - 畢竟,調用ws://localhost:8081/ws觸發了一些Spring的東西(如日誌中所見)。

我們都喜歡有多個框架的遺留應用程序,對嗎?

0

我想你應該把@Controller註釋添加到WebSocketConfigurer類中,如果不是所有的http請求都會被Spring的DispatcherServlet處理。相關閱讀:Spring websocket getting 404 not found

+0

我已經看到了大多數相關的問題,並沒有列出的解決方案爲我工作,真的。我的'@ Configuration'註釋組件被找到並觸發,Web套接字處理程序_seems被正確註冊,但我仍然在'/ ws'獲得404。它似乎從不嘗試將HTTP請求提升到web套接字會話中。 – JustACluelessNewbie

相關問題