我遇到了一个奇怪的问题。如果我调用一个返回DeferredResult的端点,即使它返回的响应是200,它也会以401的形式到达。我还通过调用这个端点对postman进行了测试,如果我调用一个普通的端点,它会返回正确的响应。
@RequestMapping(path = "/sign-document1", method = RequestMethod.GET)
public DeferredResult<ResponseEntity<?>> signFile1(){
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(5000L);
deferredResult.onTimeout(() -> deferredResult.setErrorResult(
ResponseEntity
.status(HttpStatus.REQUEST_TIMEOUT)
.body("Request timeout!")));
deferredResult.setResult(new ResponseEntity<>(HttpStatus.OK));
return deferredResult; //this is received as 401
}
@RequestMapping(path = "/sign-document2", method = RequestMethod.GET)
public ResponseEntity<?> signFile2(){
return new ResponseEntity<>(HttpStatus.OK); //received as 200
}
我在https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga上找到了一条关于这个的评论:
迁移到Spring Boot 3后,返回类型为DeferredResult
的一个端点现在将返回HTTP代码401。经过一番调查,我发现这是由于spring.security.filter.dispatcher-types
属性的默认值发生了变化。应记录此变化。
答案是www.example.comhttps://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#dispatch-types
所以我设置了spring.security.filter.dispatcher-types=request, async, error, forward, include
,我仍然有同样的问题。
任何帮助都很感激。
2条答案
按热度按时间inkz8wg91#
在Spring Security 6中,授权规则现在应用于所有调度程序类型。
在Spring Security 6.0.0中,
SecurityContextHolderFilter
was not applied toASYNC
dispatches,因此没有为这些请求加载SecurityContext
。此问题在Spring Security 6.0.1中已出现。建议升级到Sping Boot 〉= 3.0.1,或者,如果不可能,应用此解决方法。
yr9zkbsy2#
看起来如果我把
spring.security.filter.dispatcher-types
设置为空,它就可以工作了。如果有人能解释一下为什么,我将非常感激。