java - 如何在 doPost( 方法主体内访问用于 servlet 请求的 SSLSocket?

标签 java servlets jakarta-ee jsse sslsocketfactory

我通过子类化 javax.servlet.http.HttpServlet 并重写 doPost 方法来实现 HTTP servlet。在 doPost 方法的主体中,我需要访问用于处理请求并将用于处理响应的 SSLSocket 对象。 servlet 容器也被用作 HTTPS 服务器。 Servlet容器前面没有Web服务器、负载均衡器、TLS终止设备等。客户端仅使用 HTTPS 直接连接到 servlet 容器。

如何访问用于处理请求并将用于处理 doPost 方法体内的响应的 SSLSocket 对象?

您可能好奇为什么我需要这样做。我需要访问与连接关联的 channel 绑定(bind)信息。是的,我知道 channel 绑定(bind)支持目前在 JSSE 规范中尚未标准化,因此 Oracle 提供的默认 JSSE 提供程序不支持 channel 绑定(bind)支持。这就是为什么我使用支持 channel 绑定(bind)的 Bouncy CaSTLe JSSE 提供程序。

最佳答案

首先,在 doPost 中设置断点并深入查看您在线程堆栈上看到的变量。有一个请求/响应对象,它们将是特定于实现的(tomcat、jetty 等...)

解决方案取决于这些:

a) 是否可以通过钻取请求或响应的私有(private)字段来访问 sslsocket。我知道你可以使用 tomcat。

b) 如果您可以并且愿意编写使用反射的代码,并且没有安全策略阻止您调用 Field.setAccessible(true) 并使用 Field.get(..) 获取值

c) 如果您有能力处理故障,并且您有明确的迹象表明可以在 dev 或 qa 中检测到此未编译代码的回归。这是因为服务器版本将来肯定会更新,并且您的代码可能会在没有编译错误的情况下突然中断。集成测试是必须的。

所以您可能已经猜到了,通过反射,您可以钻取请求或响应的任何字段。

关于java - 如何在 doPost( 方法主体内访问用于 servlet 请求的 SSLSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935408/

相关文章:

java - 从 servlet 内获取 Web 应用程序类路径

java - 无法下载tomcat maven插件?

java - Gradle:从命令行将参数传递给编译器

java - 用Java处理html日期输入

java - 如何检查该对象是否不是最后一个以及如何处理它?

jsp - 如何在 web.xml 中配置欢迎文件列表

java - resteasy 和 multipart/form-data 请求的最大文件大小

eclipse - 在 eclipse 中运行 jms 示例时,资源注入(inject)不起作用。

java - 如何使用 java 8 修复以下 NullPointerException?

java - 充气 CardView 时出错