有时需要允许不安全的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 Optional的类,但是
非工作代码:
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指针异常(由!!运算符引起)。
一些无效的建议:
我只想从使用 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 未定义,我不知道它应该是什么。
我对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