Nginx 클 러 스 터 + websocket 웹 socket 클 라 이언 트 의 실제 IP 가 져 오기

2936 단어 Springboot
  • Nginx 는 다음 설정 을 추가 합 니 다
  •        proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header REMOTE-HOST $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         2. 자바 프로그램 중
  • HttpSessionConfigurator 증가
  • 
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpSession;
    import javax.websocket.HandshakeResponse;
    import javax.websocket.server.HandshakeRequest;
    import javax.websocket.server.ServerEndpointConfig;
    import javax.websocket.server.ServerEndpointConfig.Configurator;
    
    import org.apache.commons.lang.StringUtils;
    
    
    public class HttpSessionConfigurator extends Configurator {
    
        @Override
        public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        	HttpSession httpSession = (HttpSession) request.getHttpSession();
            sec.getUserProperties().put(HttpSession.class.getName(), httpSession);
            Map> headers = request.getHeaders();
            List addressMap = new ArrayList();
        	String realAddress;
        	try {
        		addressMap = headers.get("x-forwarded-for");  
        		if (addressMap == null || addressMap.size() == 0) {  
        			addressMap = headers.get("Proxy-Client-realAddress");  
        		}  
        		if (addressMap == null || addressMap.size() == 0) {  
        			addressMap = headers.get("WL-Proxy-Client-realAddress");  
        		}  
        		if (addressMap == null || addressMap.size() == 0) {  
        			realAddress = "";
        		} else{
        			realAddress = addressMap.get(0);
            		if(StringUtils.isEmpty(realAddress)){
            			realAddress = "";
            		}
        		}
        		
        	} catch (Exception e) {
        		realAddress = "";
        	}
            sec.getUserProperties().put("realAddress", realAddress);
        }
    }
  • WebSocketServer 의 @ ServerEndpoint 가
  • 로 변경 되 었 습 니 다.
    @ServerEndpoint(value="/ws/{sid}/{stype}",configurator = HttpSessionConfigurator.class)
    
  • 웹 소켓 서버 의 onOpen 방법 재 작성
  •  @OnOpen
        public void onOpen(Session session,EndpointConfig config ,@PathParam("sid") String sid, @PathParam("stype") String stype) {
        	String  realAddress =  (String) config.getUserProperties().get("realAddress");
        	this.session = session;
            webSocketSet.add(this);     //  set 
            addOnlineCount();           //    1
            LogUtil.getLoger("xxxx.ws").info("        :"+realAddress+"/"+sid+"/"+stype+",       " + getOnlineCount()); 
            this.sid=sid;
            try {
            	 sendMessage("connected");
            } catch (IOException e) {
            	LogUtil.getLoger("cnyy.ws").info("websocket IO  ");
            }
        }

            이상 

    좋은 웹페이지 즐겨찾기