如何向基于Tyrus注释的客户端添加请求标头

问题描述:

我正在尝试使用带有基于注释的客户端端点的tyrus独立客户端(tyrus-standalone-client-1.9)来访问websocket服务器端点。我主要是遵循this example如何向基于Tyrus注释的客户端添加请求标头

也就是说,我的客户端点目前看起来像

@ClientEndpoint 
public class MyClientEndpoint { 

    private static CountDownLatch latch; 

    private Logger logger = Logger.getLogger(this.getClass().getName()); 

    @OnOpen 
    public void onOpen(Session session) throws Exception { 
     session.getBasicRemote().sendText("initialRequest") 
    } 

    @OnMessage 
    public void onMessage(String message, Session session) throws Exception { 
     // do something 
    } 

    @OnClose 
    public void onClose(Session session, CloseReason closeReason) { 
     logger.info(String.format("Session %s close because of %s", session.getId(), closeReason)); 
     latch.countDown(); 
    } 

    public static void main(String[] args) { 
     latch = new CountDownLatch(1); 

     ClientManager client = ClientManager.createClient(); 
     try { 
      URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint"); 
      client.connectToServer(MyClientEndpoint.class, serverEndpointUri); 
      latch.await(); 

     } catch (DeploymentException | URISyntaxException | InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

不过,我需要与请求一起传递一些会话ID,我需要修改请求的来源头让我的连接被接受服务器端点。

在编程客户端的端点我可以做类似

final Builder configBuilder = ClientEndpointConfig.Builder.create(); 
configBuilder.configurator(new Configurator() { 
    @Override 
    public void beforeRequest(final Map<String, List<String>> headers) { 
     headers.put("Cookie", Arrays.asList("X-Session=0f822c8c-bf63-4ae7-9d2f-af263f86baad")); 
     headers.put("Origin", Arrays.asList("http://localhost")); 
    } 
}); 
ClientEndpointConfig clientConfig = configBuilder.build(); 
ClientManager client = ClientManager.createClient(); 
URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint"); 
client.connectToServer(new MyClientEndpoint(), clientConfig, serverEndpointUri); 

但似乎没有要任何选项来配置传递到基于注解的客户端。

有没有其他的方式来添加/修改我目前缺少的请求标头?我真的很想留在基于注解的方法,因为它似乎是干净多了,我...

ModifyRequestResponseHeadersTest.java:183

@ClientEndpoint(configurator = MyClientConfigurator.class) 
public static class MyClientEndpoint { 
    public static final CountDownLatch messageLatch = new CountDownLatch(1); 
    public static volatile String receivedMessage; 

    @OnOpen 
    public void onOpen(Session session) throws IOException { 
     session.getBasicRemote().sendText(SENT_MESSAGE); 
    } 

    @OnMessage 
    public void onMessage(String message) { 
     receivedMessage = message; 
     messageLatch.countDown(); 
    } 
} 

而且MyClientConfigurator:

public static class MyClientConfigurator extends ClientEndpointConfig.Configurator { 
    static volatile boolean called = false; 

    @Override 
    public void beforeRequest(Map<String, List<String>> headers) { 
     called = true; 
     headers.put(HEADER_NAME, Arrays.asList(HEADER_VALUE)); 
     headers.put("Origin", Arrays.asList("myOrigin")); 
    } 

    @Override 
    public void afterResponse(HandshakeResponse handshakeResponse) { 
     final Map<String, List<String>> headers = handshakeResponse.getHeaders(); 

     assertEquals(HEADER_VALUE[0], headers.get(HEADER_NAME).get(0)); 
     assertEquals(HEADER_VALUE[1], headers.get(HEADER_NAME).get(1)); 
     assertEquals(HEADER_VALUE[2], headers.get(HEADER_NAME).get(2)); 
     assertEquals("myOrigin", headers.get("origin").get(0)); 
    } 
} 
+0

大,非常感谢很多! 我知道,我错过了一些非常简单的选择... – dpr 2014-12-10 10:40:12