向现有的Spring应用程序添加Web套接字支持

可能是

我正在使用一个Spring 4应用程序(Spring Boot不幸的是,不是),但我无法使Web套接字正常工作。有一个简单的TextWebSocketHandler实现,我在注册/ws路径,我得到一个确认日志:

将URL路径[/ ws]映射到类型为[class 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值不是null,并且实际上实现了该WebSocketHandler接口。当配置器明显被触发时,连接会"ws://localhost:8081/ws"导致错误:

WebSocket与“ ws:// localhost:8081 / ws”的连接失败:WebSocket握手期间出错:意外的响应代码:404

错误{目标:WebSocket,isTrusted:true,currentTarget:WebSocket,eventPhase:2,气泡:false,可取消:false,defaultPrevented:false,时间戳:1469616712980247,originalTarget:WebSocket,explicitOriginalTarget:WebSocket,NONE:0}

我用来测试Web套接字机制的客户端代码非常简单:

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插件)运行该应用程序

通过Spring调试日志时,我只能猜测Spring无法将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: 'org.springframework.security.core.context.SecurityContextImpl@4190548c: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@4190548c: Principal: org.springframework.security.core.userdetails.User@58c7c40: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@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.springframework.security.authentication.UsernamePasswordAuthenticationToken@4190548c: Principal: org.springframework.security.core.userdetails.User@58c7c40: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@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.springframework.security.authentication.UsernamePasswordAuthenticationToken@4190548c: Principal: org.springframework.security.core.userdetails.User@58c7c40: Username: [removed]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@12afc: RemoteIpAddress: 127.0.0.1; SessionId: 1om9yxo93cwce1qb1tu0rcs15n; Granted Authorities: ROLE_USER
13:14:02.322 [qtp1305935114-14] DEBUG - Voter: org.springframework.security.access.vote.RoleVoter@b5de58f, 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.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@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

浏览了官方文档和示例后,似乎Web套接字配置是非常标准的。为了在Spring中启用Web套接字,我可能错过了什么,或者可能需要更改任何配置吗?

可能是

事实证明,Web套接字可以按预期工作,但未在/*设置Spring 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的东西(如日志中所示)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改现有的ASP .NET Web应用程序以支持多个时区

来自分类Dev

将GWT添加到现有的Maven Web应用程序

来自分类Dev

使用 .Net 4 将 MVC 项目添加到现有的 Web 应用程序

来自分类Dev

向现有 iOS 应用程序添加推送通知

来自分类Dev

将Web API添加到现有的asp.net Web窗体应用程序

来自分类Dev

如何将更多的Web应用程序添加到现有的Windows Azure网站

来自分类Dev

需要向所有现有的ASP.NET Web应用程序(超过300个)添加“应用程序反馈”功能

来自分类Dev

向现有的Pycharm项目添加Flask支持

来自分类Dev

如何在现有的Windows应用程序中获得ATL支持

来自分类Dev

如何在现有的Windows应用程序中获得ATL支持

来自分类Dev

将基于令牌的安全性集成到现有的Spring Security Web应用程序中

来自分类Dev

如何将 Angular 4 与现有的基于 Spring Boot jsp 的 Web 应用程序集成?

来自分类Dev

为现有的Spring MVC应用程序(Spring Mobile或Phonegap)设计一个移动应用程序

来自分类Dev

将现有的Spring应用程序转换为Spring-Boot

来自分类Dev

将Spring Boot与现有的Spring应用程序集成

来自分类Dev

如何在现有的spring-mvc应用程序中集成spring-integration?

来自分类Dev

在 Spring Cloud Data Flow 中部署现有的 Spring Cloud Stream 应用程序

来自分类Dev

将网站添加到现有的Azure移动应用程序(应用程序服务)

来自分类Dev

将MeteorJS添加到现有的AngularJS / MEAN堆栈应用程序

来自分类Dev

如何将LiveView添加到现有的Elixir / Phoenix应用程序?

来自分类Dev

将websockets添加到现有的php应用程序

来自分类Dev

如何在现有的Apple Watch应用程序中添加和运行Glance?

来自分类Dev

从(现有的)Kotlin 程序启动 TornadoFX 应用程序

来自分类Dev

将现有的Web窗体应用程序迁移到ASP.Net MVC单页应用程序

来自分类Dev

如何在现有的Web应用程序中逐步淘汰密码哈希算法?

来自分类Dev

如何在现有的Django Web应用程序之上集成wordpress前端

来自分类Dev

在现有的Java Web应用程序中使用React JS

来自分类Dev

使用Java Servlet扩展现有的Web应用程序

来自分类Dev

Aspectj:在现有的Web应用程序中部署方面

Related 相关文章

  1. 1

    更改现有的ASP .NET Web应用程序以支持多个时区

  2. 2

    将GWT添加到现有的Maven Web应用程序

  3. 3

    使用 .Net 4 将 MVC 项目添加到现有的 Web 应用程序

  4. 4

    向现有 iOS 应用程序添加推送通知

  5. 5

    将Web API添加到现有的asp.net Web窗体应用程序

  6. 6

    如何将更多的Web应用程序添加到现有的Windows Azure网站

  7. 7

    需要向所有现有的ASP.NET Web应用程序(超过300个)添加“应用程序反馈”功能

  8. 8

    向现有的Pycharm项目添加Flask支持

  9. 9

    如何在现有的Windows应用程序中获得ATL支持

  10. 10

    如何在现有的Windows应用程序中获得ATL支持

  11. 11

    将基于令牌的安全性集成到现有的Spring Security Web应用程序中

  12. 12

    如何将 Angular 4 与现有的基于 Spring Boot jsp 的 Web 应用程序集成?

  13. 13

    为现有的Spring MVC应用程序(Spring Mobile或Phonegap)设计一个移动应用程序

  14. 14

    将现有的Spring应用程序转换为Spring-Boot

  15. 15

    将Spring Boot与现有的Spring应用程序集成

  16. 16

    如何在现有的spring-mvc应用程序中集成spring-integration?

  17. 17

    在 Spring Cloud Data Flow 中部署现有的 Spring Cloud Stream 应用程序

  18. 18

    将网站添加到现有的Azure移动应用程序(应用程序服务)

  19. 19

    将MeteorJS添加到现有的AngularJS / MEAN堆栈应用程序

  20. 20

    如何将LiveView添加到现有的Elixir / Phoenix应用程序?

  21. 21

    将websockets添加到现有的php应用程序

  22. 22

    如何在现有的Apple Watch应用程序中添加和运行Glance?

  23. 23

    从(现有的)Kotlin 程序启动 TornadoFX 应用程序

  24. 24

    将现有的Web窗体应用程序迁移到ASP.Net MVC单页应用程序

  25. 25

    如何在现有的Web应用程序中逐步淘汰密码哈希算法?

  26. 26

    如何在现有的Django Web应用程序之上集成wordpress前端

  27. 27

    在现有的Java Web应用程序中使用React JS

  28. 28

    使用Java Servlet扩展现有的Web应用程序

  29. 29

    Aspectj:在现有的Web应用程序中部署方面

热门标签

归档