我正在用 Java 创建一个类,从服务器下载特定文件。我有一种可以直接从FTP服务器下载的方法,还有一种可以从SFTP服务器下载的方法。
在不对主机名进行任何假设的情况下(不检查它是否以 ftp:// 或 sftp:// 开头,因为有时服务器可能是本地的),有没有办法确定服务器是 FTP 还是 SFTP,因此使用哪种方法?
理想情况下,我想以编程方式确定,而不仅仅是在失败时尝试替代方案。感谢您提前提供任何帮助!
编辑:对于任何感兴趣的人,我的非常基本且绝对不完美的解决方案是这样的:
private int determineServerProtocol(String host, String port) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try (Socket socket = new Socket(host, Integer.parseInt(port))) {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
result = in.readLine();
out.close();
in.close();
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
if (result.contains("SSH")) {
System.out.println("Server is SFTP");
// do things...
} else {
System.out.println("Server is FTP");
// …Run Code Online (Sandbox Code Playgroud) 我想在用户从会话超时中注销时执行自定义事件。在我的 application.properties 指定的时间长度后,用户成功注销:
server.servlet.session.timeout=10
server.servlet.session.cookie.max-age=10
Run Code Online (Sandbox Code Playgroud)
我发现了一些涉及 SessionDestroyedEvent 的类似解决方案,例如:
@Slf4j
@Component
public class SessionExpiredListener implements ApplicationListener<SessionDestroyedEvent> {
@Override
public void onApplicationEvent(SessionDestroyedEvent event) {
for (SecurityContext securityContext : event.getSecurityContexts()) {
Authentication authentication = securityContext.getAuthentication();
UserPrincipal user = (UserPrincipal) authentication.getPrincipal(); // UserPrincipal is my custom Principal class
log.debug("Session expired!" + user.getUsername());
// do custom event handling
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是 SessionDestroyedEvent 未与会话超时同时触发,在我的测试中,它在会话过期后最多 5 分钟触发。
我也尝试过在 HttpSessionListener 中使用 sessionDestroyed 但结果相似。
是否有一个事件会在会话到期时触发,或者有什么方法可以实现这一点?
我正在阅读有关函数式接口(https://www.baeldung.com/java-8-function-interfaces)的内容,并且关于 a Supplier<T>,它是这样说的:
\n\n\n供应商的另一个用例是定义序列生成的逻辑。为了演示它,让\xe2\x80\x99s 使用静态 Stream.generate 方法来创建斐波那契数字流:
\n
int[] fibs = {0, 1};\nStream<Integer> fibonacci = Stream.generate(() -> {\n int result = fibs[1];\n int fib3 = fibs[0] + fibs[1];\n fibs[0] = fibs[1];\n fibs[1] = fib3;\n return result;\n});\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n传递给 Stream.generate 方法的函数实现了Supplier 功能接口。请注意,要用作生成器,供应商通常需要某种外部状态。在这种情况下,其状态由最后两个斐波那契数列组成。
\n\n为了实现这种状态,我们使用一个数组而不是几个变量,因为 lambda 内部使用的所有外部变量实际上都是 Final。
\n
我理解为什么变量在 lamdba 或匿名类中需要是最终的,我不明白的是为什么数组的值是“有效的最终”。
\n\n我用下面的例子来说明这一点:
\n\nfinal boolean run = true;\nexecutor.execute(() -> {\n while (run) {\n // do something\n }\n});\nRun Code Online (Sandbox Code Playgroud)\n\n这里run …