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