首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问WebSocket @ServerEndpoint中的WebSocket属性

访问WebSocket @ServerEndpoint中的WebSocket属性
EN

Stack Overflow用户
提问于 2016-03-23 17:02:07
回答 1查看 2.8K关注 0票数 2

我需要访问HttpServletRequest属性来获取javax.servlet.request.X509Certificate,它包含用于TLS请求的证书的X509Certificate数组。

从JAX-RS ContainerRequestFilter中,我可以很容易地从ContainerRequestContext.getProperty(String property)方法中提取它,但是我无法找到从WebSocket SessionHandshakeRequest获取它的方法,因为我可以从HandshakeRequest中访问HttpSession实例,但不能访问HttpServletRequest实例。

注意:这不是Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint的副本,因为我需要访问HttpServletRequest (或等效于提取HttpServletRequest证书),而不是HttpSession

由于WebSocket是HTTP的超集,我想它应该是可能的,并希望Java已经想出了一种访问servlet属性的方法,但我真的找不到。有人知道这是否可能吗?

EN

回答 1

Stack Overflow用户

发布于 2016-03-23 19:49:26

没有黑客:

  1. 创建与websocket握手请求匹配的URL模式上的servlet过滤器。
  2. 在筛选器中,获取感兴趣的请求属性,并在继续链接之前将其放在会话中。
  3. 最后,从会话中获取它,而会话则是通过握手请求获得的。

与黑客有关:

  1. 使用反射在握手请求实例中查找ServletRequest字段。
  2. 获取它的javax.servlet.request.X509Certificate属性。 换言之: 公共类ServletAwareConfigurator扩展Configurator { @Override void modifyHandshake(ServerEndpointConfig config,HandshakeRequest request,HandshakeResponse response) { ServletRequest servletRequest = getField(request,ServletRequest.class);X509 Certificate[]证书=(X509 Certificate[])ServerEndpointConfig // .}私有静态 F getField(I实例,类fieldType) { try {try{ for (F> type =F>());类型!= Object.class;类型=type.getSuperclass(){ for (字段: type.getDeclaredFields()) { if (fieldType.isAssignableFrom(field.getType(){field.setAccessible(真);返回(F) field.get(实例);}}{ //句柄?}返回空;}}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36184382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档