我看到了以下关于如何定制spring security webflux的帖子:spring webflux自定义API身份验证
如果我们在ServerSecurityContextRepository.Load中抛出异常,那么Spring会将http头更新为500,而我无法操作此异常。
但是,在controller中抛出的任何错误都可以使用常规的@ControllerAdvision来处理,这只是启动了webflux安全性。
spring webflux安全性中是否存在处理异常的问题?
我找到的解决方案是创建一个实现ErrorWebExceptionHandler
的组件。ErrorWebExceptionHandler
bean的实例在Spring Security过滤器之前运行。下面是我使用的一个示例:
@Slf4j
@Component
public class GlobalExceptionHandler implements ErrorWebExceptionHandler {
@Autowired
private DataBufferWriter bufferWriter;
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
AppError appError = ErrorCode.GENERIC.toAppError();
if (ex instanceof AppException) {
AppException ae = (AppException) ex;
status = ae.getStatusCode();
appError = new AppError(ae.getCode(), ae.getText());
log.debug(appError.toString());
} else {
log.error(ex.getMessage(), ex);
}
if (exchange.getResponse().isCommitted()) {
return Mono.error(ex);
}
exchange.getResponse().setStatusCode(status);
return bufferWriter.write(exchange.getResponse(), appError);
}
}
如果您要注入HttpHandler
,那么它有点不同,但是思想是相同的。
更新:为了完整起见,这里是我的DataBufferWriter
对象,它是@component
:
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class DataBufferWriter {
private final ObjectMapper objectMapper;
public <T> Mono<Void> write(ServerHttpResponse httpResponse, T object) {
return httpResponse
.writeWith(Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = httpResponse.bufferFactory();
try {
return bufferFactory.wrap(objectMapper.writeValueAsBytes(object));
} catch (Exception ex) {
log.warn("Error writing response", ex);
return bufferFactory.wrap(new byte[0]);
}
}));
}
}
我正在编写一个复杂的应用程序,作为Spring5 Web流的一个实验。我计划在这个应用程序中使用很多技术。我熟悉“旧风格”的@RestController,但现在,我正在编写功能终结点。例如,公司注册服务的后端。我在“旧世界”中寻找类似于“控制建议”的东西。但我真的找不到任何类似于反应性等价物的东西。(或者任何对我有用的东西。) 我有一个非常基本的设置。一个路由函数、一个反应式Cassandra存
问题很简单:我正在寻找一种优雅的方式,将<code>CompletableFuture#与<code>CompletableFuture#supplySync</code>一起使用。这是不起作用的: 我认为背后的想法正是为了处理抛出的情况。然而,如果我这样做,它会起作用: 我可以这样做,但是这看起来很可怕,而且让事情更难维护。有没有一种不需要将所有< code>Exception转换为< code
集成百度移动统计后报错 Q:集成百度移动统计后,开始没什么问题,但最近一段时间每次运行都会先打印出一堆错误信息,并且会重复好多遍 A:造成这种情况是由于sdk捕获异常。可能是网络环境不稳定引起的日志发送失败,网络环境正常的话会自行恢复。可以再继续观察一下,如果仍有问题,可以将问题发送至apptongji@baidu.com 会有专人为您解答。 为什么自定义事件被归入[未知]? Q:为什么自定义事件
我不知道该怎么办。 当我试图从解析器获取语法错误的数量时,它显示0。 编辑: 它返回null。
Blade 内置了 异常处理器,在开发者模式下它会将异常输出在前端页面,并在控制台打印堆栈信息,生产环境只打印在控制台。 有些时候不满足我们的需求,这时候就需要自定义异常处理了,比如针对某个自定义的异常进行特殊处理。 我们用一个例子来解释如何操作。 定义了一个名为 TipException 的运行时异常类,用于输出错误消息到前台。 按照上面对异常的处理情况这个异常的堆栈信息会被输出在控制台,生产环
任何方法都可以抛出不同类型的异常。这些异常可能是需要应用程序重新部署来解决的编程错误,或者是不需要重新部署但可以解决的暂时性错误。 Hangfire可以处理所有内部的(属于Hangfire本身)和相关的外部方法(任务,过滤器等)的异常,因此不会导致整个应用程序被关闭。所有内部异常都被记录(所以不要忘记 启用日志),最糟糕的情况是导致后台任务被暂停并延时重试 10 次。 当Hangfire遇到在执行