小编vag*_*ran的帖子

允许Java JDK 11 HttpClient的不安全的HTTPS连接

有时需要允许不安全的HTTPS连接,例如在一些应该与任何站点一起使用的Web爬行应用程序中.我在旧的HttpsURLConnection API中使用了一个这样的解决方案,最近被JDK 11中的新HttpClient API取代了.使用这个新API允许不安全的HTTPS连接(自签名或过期证书)的方法是什么?

UPD:我尝试的代码(在Kotlin中,但直接映射到Java):

    val trustAllCerts = arrayOf<TrustManager>(object: X509TrustManager {
        override fun getAcceptedIssuers(): Array<X509Certificate>? = null
        override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {}
        override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {}
    })

    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, trustAllCerts, SecureRandom())

    val sslParams = SSLParameters()
    // This should prevent host validation
    sslParams.endpointIdentificationAlgorithm = ""

    httpClient = HttpClient.newBuilder()
        .sslContext(sslContext)
        .sslParameters(sslParams)
        .build()
Run Code Online (Sandbox Code Playgroud)

但在发送时我有异常(尝试使用自签名证书的localhost):

java.io.IOException: No name matching localhost found
Run Code Online (Sandbox Code Playgroud)

使用IP地址而不是localhost会出现"无主题替代名称存在"异常.

在对JDK进行一些调试之后,我发现sslParams在抛出异常的地方真的被忽略了,并且使用了一些本地创建的实例.进一步调试显示,影响主机名验证算法的唯一方法是将jdk.internal.httpclient.disableHostnameVerification系统属性设置为true.这似乎是一个解决方案.SSLParameters在上面的代码中没有任何影响,所以这部分可以被丢弃.使其仅在全局配置看起来像新的HttpClient API中的严重设计缺陷.

java java-http-client java-11

14
推荐指数
3
解决办法
3993
查看次数

如何在Kotlin中实现可变的可选?

我想要一个等效于Java Optional的类,但是

  • 正确处理空值(“未设置”状态与“空设置”不同)
  • 易变
  • 使用Kotlin内置的null安全性,type参数可以为可为null或不可为null,这会影响所有方法。

非工作代码:

class MutableOptional<T> {
    private var value: T? = null
    private var isSet: Boolean = false

    fun set(value: T)
    {
        this.value = value
        isSet = true
    }

    fun unset()
    {
        isSet = false
        value = null
    }

    fun get(): T
    {
        if (!isSet) {
            throw Error("Value not set")
        }
        return value!! // <<< NPE here
    }
}

fun f()
{
    val opt = MutableOptional<Int?>()
    opt.set(null)
    assertNull(opt.get())
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我尝试设置null,则get()调用将失败,并出现null指针异常(由!!运算符引起)。

一些无效的建议:

  • 不要使用“ T”类型的成员?在这样的班上。如果我知道如何使它们保持未初始化状态(编译器不允许)或如何使它们具有默认初始化,就不会使用它。
  • 使用“ fun get():T?” …

kotlin

7
推荐指数
1
解决办法
291
查看次数

如何在 Kotlin 中指定递归泛型参数?

我只想从使用 Log4j (v2.8.2) 的 Java 移植以下代码:

ConsoleAppender appender = ConsoleAppender.newBuilder().
            withName("ConsoleAppender").build();
Run Code Online (Sandbox Code Playgroud)

问题在于 newBuilder() 方法,该方法在 log4j 中被定义为某种递归泛型:

@PluginBuilderFactory
public static <B extends Builder<B>> B newBuilder() {
    return new Builder<B>().asBuilder();
}
Run Code Online (Sandbox Code Playgroud)

Java 代码会自动推断泛型参数,而 Kotlin 则不然。在 Kotlin 中调用这个方法有什么解决方案吗?

我在 Kotlin 中尝试过的代码:

val appender = ConsoleAppender.newBuilder().withName("ConsoleAppender").build()
Run Code Online (Sandbox Code Playgroud)

它有以下错误:

错误:(90, 48) Kotlin:类型推断失败:没有足够的信息来推断 fun 中的参数 B !> newBuilder(): B!请明确指定。

当代码在粘贴时自动从 Java 转换时,它会设置一些存根newBuilder<B>(),其中 B 未定义,我不知道它应该是什么。

generics log4j kotlin

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

OpenCV中的recoverPose()函数是左撇子吗?

我对OpenCV相机姿态估计进行简单测试.将照片和相同的照片放大(放大)我用它们来检测特征,计算基本矩阵并恢复相机姿势.

Mat inliers;
Mat E = findEssentialMat(queryPoints, trainPoints, cameraMatrix1, cameraMatrix2,
                         FM_RANSAC, 0.9, MAX_PIXEL_OFFSET, inliers);

size_t inliersCount =
    recoverPose(E, queryGoodPoints, trainGoodPoints, cameraMatrix1, cameraMatrix2, R, T, inliers);
Run Code Online (Sandbox Code Playgroud)

因此,当我将原始图像指定为第一个,并将缩放图像指定为第二个时,我得到平移T接近[0; 0; -1].然而,第二个相机(缩放)实际上比第一个更接近物体.因此,如果Z轴从图像平面进入场景,则第二个摄像机应沿Z轴具有正偏移.对于我得到的结果,Z轴从图像平面朝向摄像机,其中与其他轴(X向右,Y向下)形成左手坐标系.真的吗?为什么这个结果与此处所示的坐标系不同?

c++ opencv computer-vision pose-estimation structure-from-motion

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