gpt4 book ai didi

java - 如何防止有人快速点击 Vaadin 8 中的 FileDownloader 按钮?

转载 作者:行者123 更新时间:2023-11-30 06:45:23 25 4
gpt4 key购买 nike

使用 Vaadin manual 中的代码我们有:

Button downloadButton = new Button("Download image");
FileDownloader fileDownloader = new FileDownloader(createResource());
fileDownloader.extend(downloadButton);

此示例代码的问题在于,有人可以开始不停地快速单击 downloadButton,并且动态创建的文件将在用户单击时尽快生成。有没有办法设置限制器,也就是说在 x 次后阻止用户下载?此外,如果您快速单击它,您会收到一个错误,特别是 DefaultErrorHandler

至少我想要一种方法来防止某人下载文件超过 x 次。最好也有类似 downloadButton.disableOnClick() 的东西,但我似乎无法在下载完成后找到重新启用的方法,因为没有 Hook 来通知你下载已完成,但主要目标是阻止某人连续下载 50 倍。

最佳答案

为此:

but I can't seem to find a way to re-enable after the download has finished because there are no hooks to notify you when the download is finished

不,据我所知,没有钩子(Hook)可以从客户端获取浏览器的下载功能以在下载准备就绪时通知 Vaadin。

然而,这可能是服务器端解决方案。

我相信您从 StreamResource 中创建了 Resource 并在后面实现:

@Override
public InputStream getStream() {
return s;
}

当流 s 关闭时,可以认为下载已准备就绪。但是 InputStream.close() 也没有钩子(Hook)。为此,您可以为 InputStream 实现包装器实现,例如:

@Slf4j
@RequiredArgsConstructor
public class CloseNotifyingInputStream extends InputStream {

@FunctionalInterface
public static interface InputStreamCloseListener {
public void onInputStreamClose(CloseNotifyingInputStream closeNotifyingInputStream);
}

private final InputStream wrappedStream;
private final InputStreamCloseListener closeListener;

@Override
public synchronized int read() throws IOException {
return wrappedStream.read();
}

@Override
public void close() throws IOException {
log.info("Download complete, closing stream");
closeListener.onInputStreamClose(this);
wrappedStream.close();
super.close();
}
}

使用这种包装器,您可以在回调函数的帮助下获得通知,然后处理您决定实现的任何按钮逻辑。

最终你在 getStream() 中的 s 会是这样的:

new CloseNotifyingInputStream(getTheActualInputStream(),
cnis -> log.info("Handling the btn logic")
);

`

关于java - 如何防止有人快速点击 Vaadin 8 中的 FileDownloader 按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com