Nginx集羣+websocket 獲取websocket客戶端的真實IP

  1. 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.Java程序中

  • 增加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<String, List<String>> headers = request.getHeaders();
        List<String> addressMap = new ArrayList<String>();
    	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)
  • WebSocketServer的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異常");
        }
    }

        以上
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章