我试图将基于微服务的Web应用程序从Spring Boot 2.0.0.M3更新到最新的2.0.0.M4。
当运行我的Eureka服务器时,我面临以下异常,并且上下文不会加载:
2017-09-19 10:22:05.455 INFO 16388 --- [ main] o.s.core.annotation.AnnotationUtils : Failed to introspect annotations on [class org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration$$EnhancerBySpringCGLIB$$5d536e23]: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
2017-09-19 10:22:05.456 INFO 16388 --- [ main] o.s.core.annotation.AnnotationUtils : Failed to introspect annotations on [class org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration$$EnhancerBySpringCGLIB$$5d536e23]: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
2017-09-19 10:22:05.572 INFO 16388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-09-19 10:22:05.573 INFO 16388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-09-19 10:22:05.579 INFO 16388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : …Run Code Online (Sandbox Code Playgroud) spring spring-boot spring-cloud netflix-eureka spring-cloud-netflix
我正在使用 Spring Webflux 并以这种方式在我的网络过滤器中处理会话:
public class DemoFilter implements WebFilter {
@Override
public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
WebSession webSession = serverWebExchange.getSession().block();
webSession.getAttributes().put("attribute", attributeValue);
return webFilterChain.filter(serverWebExchange);
}
}
Run Code Online (Sandbox Code Playgroud)
我想删除该block()指令并以非阻塞方式获取会话,因此我尝试了以下操作:
public class DemoFilter implements WebFilter {
@Override
public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
return serverWebExchange.getSession()
.doOnNext(webSession -> {
webSession.getAttributes().put("attribute", attributeValue);
}).then(webFilterChain.filter(serverWebExchange));
}
}
Run Code Online (Sandbox Code Playgroud)
在功能上,此代码与上面的代码相同,但它似乎导致会话在部署在测试环境中时不会关闭和累积(文件描述符警报)。
这是我的项目上下文:Spring Boot 2.0.0.RELEASE、Tomcat、Webclient 连接池已禁用(也导致会话未关闭)。
我在这个实现中做错了什么吗?很难找到比操作 HTTP 标头更多的 WebFilter 示例。
我有一个由 Spring Security 保护的 Webflux 应用程序,其中默认启用 CSRF 保护。但是,我无法获取要保存在会话中的 CSRF 令牌。
经过一番调查,我注意到它可能来自WebSessionServerCsrfTokenRepository.class. 在这个类中,有一个generateToken方法应该从生成的 CSRF 令牌创建一个 Mono:
public Mono<CsrfToken> generateToken(ServerWebExchange exchange) {
return Mono.fromCallable(() -> {
return this.createCsrfToken();
});
}
private CsrfToken createCsrfToken() {
return new DefaultCsrfToken(this.headerName, this.parameterName, this.createNewToken());
}
private String createNewToken() {
return UUID.randomUUID().toString();
}
Run Code Online (Sandbox Code Playgroud)
但是,即使该generateToken方法被 调用CsrfWebFilter,该createCsrfToken方法也永远不会被调用,并且我永远不会在会话中获取要保存的 CSRF 令牌。我的断点永远不会进入该createCsrfToken方法,这可能意味着它永远不会被订阅。
我正在Netty使用 Spring Boot2.1.0.RELEASE和 Spring Security 5.1.1.RELEASE。
我在一个仅包含以下依赖项的空示例应用程序上重现了该问题:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId> …Run Code Online (Sandbox Code Playgroud)