相关疑难解决方法(0)

使用MockMvc在Spring MVC中进行单元测试/登录

我有一个使用Spring MVC创建的非常简单的REST应用程序.(代码可在GitHub上获得.)它有WebSecurityConfigurer如下简单:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .csrf().disable()
            .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .and()
            .authorizeRequests()
                .antMatchers("/user/new").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login").permitAll()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(authenticationFailureHandler)
                .and()
            .logout()
                .permitAll()
                .logoutSuccessHandler(logoutSuccessHandler);
}
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,自定义控制器和登录/注销页面都可以正常运行.我甚至可以通过单元测试 .但是,当我尝试使用以下功能进行测试时/user/newMockMvc/login

@Test
public void testUserLogin() throws Exception {
    RequestBuilder requestBuilder = post("/login")
            .param("username", testUser.getUsername())
            .param("password", testUser.getPassword());
    mockMvc.perform(requestBuilder)
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(cookie().exists("JSESSIONID"));
}
Run Code Online (Sandbox Code Playgroud)

它失败如下:

MockHttpServletRequest:
         HTTP Method = POST
         Request URI = /login
          Parameters = {username=[test-user-UserControllerTest], password=[test-user-UserControllerTest-password]}
             Headers = {}

             Handler:
                Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler

               Async: …
Run Code Online (Sandbox Code Playgroud)

java spring unit-testing spring-mvc mockmvc

10
推荐指数
2
解决办法
1万
查看次数

来自服务器 [200] 的 HTTP 响应不允许 HTTP 升级到 WebSocket

我的 websocket 客户端是在 STOMP Java 客户端(Spring 项目)中开发的,服务器是在 Spring boot 中实现的。

当客户端/服务器握手发生时,我遇到连接升级问题。

Java客户端代码

List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));      

SockJsClient sockjsClient = new SockJsClient(transports);   

WebSocketStompClient stompClient = new WebSocketStompClient(sockjsClient);

stompClient.setMessageConverter(new MappingJackson2MessageConverter());

stompClient.setTaskScheduler(new ConcurrentTaskScheduler());

StompSessionHandler sessionHandler = new SessionHandler();
stompClient.connect("ws://localhost:9090/health", sessionHandler);
Run Code Online (Sandbox Code Playgroud)

服务器端

@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {       
    stompEndpointRegistry.addEndpoint("/health")
            .setAllowedOrigins("*")
            .withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/topic");
    registry.setApplicationDestinationPrefixes("/app");
}
Run Code Online (Sandbox Code Playgroud)

连接到服务器时客户端产生异常

16:18:50.955/3771 [SimpleAsyncTaskExecutor-1]错误oswsscDefaultTransportRequest - TransportRequest之后不再有后备传输[url=ws://localhost:9090/health/29/344d627baac949f5bab5506f05f1a7eb/websocket]
javax.websocket.DeploymentException:来自服务器 [200] 的 HTTP 响应不允许 HTTP 升级到 WebSocket
               在org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:434)
               在org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:392)
               在 org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:194)
               在 org.springframework.web.socket.client.standard.StandardWebSocketClient.lambda$doHandshakeInternal$0(StandardWebSocketClient.java:150) …

java spring stomp websocket sockjs

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

spring ×2

mockmvc ×1

sockjs ×1

spring-mvc ×1

stomp ×1

unit-testing ×1

websocket ×1