Spring Boot项目。
基本思路ServerEndpointConfig的属性UserProperties传递参数。(比自己创建HttpSession对象简单不少)
具体操作是,首先在配置类中增加方法,从Header中取出数据,这里是取的“x-forwarded-for”的值,这是在nginx中设置到Header中的。具体代码如下:
package com.donglake.booksnet.config;
import com.donglake.booksnet.util.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import java.util.List;
import java.util.Map;
@Slf4j
@Configuration
public class WebSocketConfig extends ServerEndpointConfig.Configurator {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
Map<String, Object> userProperties = sec.getUserProperties();
Map<String, List<String>> headers = request.getHeaders();
List<String> remoteIp = headers.get("x-forwarded-for");
if(!CollectionUtil.isNullOrEmpty(remoteIp)){
log.info("ws x-forwarded-for:" + remoteIp.get(0));
userProperties.put("x-forwarded-for", remoteIp.get(0));
}
}
}
然后就是Webscoket的onOpen方法中添加Session类型的参数,然后从Session对象中获取,这里的Session是 javax.websocket 包下的,不需要我们创建。代码如下:
@OnOpen
public void onOpen(Session session, ...other params...) {
String remoteIp = (String) session.getUserProperties().get("x-forwarded-for");
....
}
就是这样,很简单不是?