我需要访问HttpServletRequest
属性以获取 javax.servlet.request.X509Certificate ,其中包含用于TLS请求的X509Certificate
证书数组。
从JAX-RS ContainerRequestFilter
我可以轻松地从ContainerRequestContext.getProperty(String property)
方法中提取它,但我找不到从WebSocket Session
获取它的方法,也不能找到{{ 1}},我可以从中访问HandshakeRequest
个实例,但不能访问HttpSession
个实例。
注意:这不是Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint的重复,因为我需要访问HttpServletRequest
(或相当于提取TLS证书),而不是HttpServletRequest
。
由于WebSocket是HTTP的超集,我想它应该是可能的,并希望Java团队想到了一种访问servlet属性的方法,但我真的找不到。任何人都知道这是否可行?
答案 0 :(得分:2)
没有黑客攻击:
黑客攻击:
ServletRequest
字段。获取其javax.servlet.request.X509Certificate
属性。
换句话说:
public class ServletAwareConfigurator extends Configurator {
@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
ServletRequest servletRequest = getField(request, ServletRequest.class);
X509Certificate[] certificates = (X509Certificate[]) servletRequest.getAttribute("javax.servlet.request.X509Certificate");
// ...
}
private static <I, F> F getField(I instance, Class<F> fieldType) {
try {
for (Class<?> type = instance.getClass(); type != Object.class; type = type.getSuperclass()) {
for (Field field : type.getDeclaredFields()) {
if (fieldType.isAssignableFrom(field.getType())) {
field.setAccessible(true);
return (F) field.get(instance);
}
}
}
} catch (Exception e) {
// Handle?
}
return null;
}
}