我有一个使用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/new
MockMvc
/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) 我的 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) …