2015-01-28 12 views
6

Ho seguito molti tutorial e codice di esempio di esempio ma devo ancora vedere un modo per accedere all'intestazione HTTP del client, al nome host ecc come il modo in cui possiamo nell'oggetto richiesta di Servlet.Come accedere al nome host, alle intestazioni http, ecc. Da un server websocket Java?

Come faccio?

Diciamo che ho SuApertura definito come-

@OnOpen 
    public void onOpen(Session session) { 

} 

Nel metodo di cui sopra, c'è un modo posso accedere ai sottostanti dettagli della connessione HTTP utilizzando il campo sessione? Sto bene anche se riesco ad arrivare a Servlet sottostante (se ce n'è uno)

+0

vedere il capitolo 4.1.1.5 a https://tyrus.java.net/documentation/1.9/user-guide.html#d0e464. Richiede una certa quantità di lavoro per ottenere le informazioni da ServerEnpointConfig.Configurator all'istanza dell'endpoint, ma è possibile farlo. (https://github.com/tyrus-project/tyrus/blob/e7d822d3aee4dcdcf2df0b0ed7c70123ad9023c5/tests/e2e/standard-config/src/test/java/org/glassfish/tyrus/test/standard_config/ModifyRequestResponseHeadersTest.java) –

+0

@PavelBucek - Grazie! sembra un sacco di lavoro solo per ottenere informazioni semplici. Ad ogni modo, puoi postare il tuo commento come risposta per favore? – gauravphoenix

risposta

1

vedere il capitolo 4.1.1.5 a Tyrus user guide. Richiede una certa quantità di lavoro per ottenere le informazioni da ServerEnpointConfig.Configurator all'istanza dell'endpoint, ma è possibile farlo. (Vedi ModifyRequestResponseHeadersTest.java)

+0

Cura di elaborare? La risposta fornita qui: http://stackoverflow.com/questions/28939581/access-useragent-in-websocket-session sembra essere basata su ciò che stai dicendo in questa risposta. Tuttavia, si commenta che non è sicuro farlo a causa della concorrenza. Quindi, sembra davvero che non possa essere fatto in sicurezza? Dovremmo nascondere le intestazioni leggere dal metodo modifyHandshake in un ThreadLocal e sperare che lo stesso thread che esegue handskake chiamerà il callback onopen? Qualcos'altro? – Ryan

0

Basato su link1 e link2

ho finalmente capito che possiamo ottenere l'IP del client con le seguenti due classi, in realtà si può fare di più con l'esposto HttpServletRequest ...

ServletAwareConfigurator .JAVA

package examples; 
import java.lang.reflect.Field; 

import javax.servlet.http.HttpServletRequest; 

import javax.websocket.HandshakeResponse; 
import javax.websocket.server.HandshakeRequest; 
import javax.websocket.server.ServerEndpointConfig; 
import javax.websocket.server.ServerEndpointConfig.Configurator; 

public class ServletAwareConfigurator extends ServerEndpointConfig.Configurator { 

    @Override 
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) { 
     HttpServletRequest httpservletRequest = getField(request, HttpServletRequest.class); 
     String sClientIP = httpservletRequest.getRemoteAddr(); 
     config.getUserProperties().put("clientip", sClientIP); 
     // ... 
    } 

    //hacking reflector to expose fields... 
    private static < I, F > F getField(I instance, Class <F> fieldType) { 
     try { 
      for (Class <?> type = instance.getClass(); type != Object.class; type = type.getSuperclass()) { 
       for (Field field: type.getDeclaredFields()) { 
        if (fieldType.isAssignableFrom(field.getType())) { 
         field.setAccessible(true); 
         return (F) field.get(instance); 
        } 
       } 
      } 
     } catch (Exception e) { 
      // Handle? 
     } 
     return null; 
    } 
} 

G etHttpSessionSocket.java

package examples; 
import java.io.IOException; 
import javax.servlet.http.HttpSession; 
import javax.websocket.EndpointConfig; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 

@ServerEndpoint(value = "/example", 
    configurator = ServletAwareConfigurator.class) 
public class GetHttpSessionSocket { 
    private Session wsSession; 
    private String sClientIP; 

    @OnOpen 
    public void open(Session session, EndpointConfig config) { 
     this.wsSession = session; 
     this.sClientIP = (String) config.getUserProperties() 
      .get("clientip"); 
    } 
    @OnMessage 
    public void echo(String msg) throws IOException { 
     wsSession.getBasicRemote().sendText(msg); 
    } 
} 
Problemi correlati