小编Spa*_*jjm的帖子

Java - 如何确定服务器是FTP还是SFTP?

我正在用 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)

java ftp sftp

6
推荐指数
1
解决办法
1万
查看次数

Spring启动会话超时事件监听器

我想在用户从会话超时中注销时执行自定义事件。在我的 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 但结果相似。

是否有一个事件会在会话到期时触发,或者有什么方法可以实现这一点?

java session events spring timeout

5
推荐指数
1
解决办法
5251
查看次数

当从匿名内部类或 lambda 访问时,为什么数组的值被视为最终或“有效最终”?

我正在阅读有关函数式接口(https://www.baeldung.com/java-8-function-interfaces)的内容,并且关于 a Supplier<T>,它是这样说的:

\n\n
\n

供应商的另一个用例是定义序列生成的逻辑。为了演示它,让\xe2\x80\x99s 使用静态 Stream.generate 方法来创建斐波那契数字流:

\n
\n\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});\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

传递给 Stream.generate 方法的函数实现了Supplier 功能接口。请注意,要用作生成器,供应商通常需要某种外部状态。在这种情况下,其状态由最后两个斐波那契数列组成。

\n\n

为了实现这种状态,我们使用一个数组而不是几个变量,因为 lambda 内部使用的所有外部变量实际上都是 Final

\n
\n\n

我理解为什么变量在 lamdba 或匿名类中需要是最终的,我不明白的是为什么数组的值是“有效的最终”。

\n\n

我用下面的例子来说明这一点:

\n\n
final boolean run = true;\nexecutor.execute(() -> {\n    while (run) {\n        // do something\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里run …

java java-8

0
推荐指数
1
解决办法
280
查看次数

标签 统计

java ×3

events ×1

ftp ×1

java-8 ×1

session ×1

sftp ×1

spring ×1

timeout ×1