websocket协议与http协议类似,也有属于自己的头信息,如下图所示,为postman在连接时自定义的header:
那么在后端中,如何像http的HttpServletRequest
一样来获取这个头信息的内容呢?
-
自定义一个WebSocket配置类:
-
modifyHandshake()方法:
建立握手时,连接前的操作,可以获取到源信息,并且传递给Session -
getEndpointInstance()方法:
初始化端点对象,也就是被@ServerEndpoint所标注的对象
@Configuration public class WebSocketConfig extends ServerEndpointConfig.Configurator { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } /** * 建立握手时,连接前的操作 */ @Override public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { // 这个userProperties 可以通过 session.getUserProperties()获取 final Map<String, Object> userProperties = sec.getUserProperties(); Map<String, List<String>> headers = request.getHeaders(); List<String> remoteIp = headers.get("x-forwarded-for"); List<String> header1 = headers.get("x1"); List<String> header2 = headers.get("x2"); userProperties.put("header1", header1.get(0)); userProperties.put("header2", header2.get(0)); userProperties.put("x-forwarded-for", remoteIp.get(0)); } /** * 初始化端点对象,也就是被@ServerEndpoint所标注的对象 */ @Override public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException { return super.getEndpointInstance(clazz); } }
-
-
在
@ServerEndpoint(value = "/websocket/document",configurator = WebSocketConfig.class)
中指定我们的自定义配置类。 -
封装一个获取头信息的方法
public static String getHeader(Session session, String headerName) { final String header = (String) session.getUserProperties().get(headerName); if (StrUtil.isBlank(header)) { log.error("获取header失败,不安全的链接,即将关闭"); try { session.close(); } catch (IOException e) { e.printStackTrace(); } } return header; }
-
在任意能够获取到Session的地方使用即可文章来源:https://www.toymoban.com/news/detail-427840.html
@OnMessage public void onMessage(Session session, String message) { log.info("client received message:{}, session:{},", message,session.hashCode()); final String header = WebSocketUtil.getHeader(session, "header1"); try { session.getBasicRemote().sendText(header); } catch (IOException e) { e.printStackTrace(); } }
值得注意的是:文章来源地址https://www.toymoban.com/news/detail-427840.html
- Configurator 实现类只在初始化端点时时执行一次
- 其他的后续遇到再回来补…
到了这里,关于springboot如何获取websocket的header头信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!