笔者采用了 Java EE 技术编写的 WebSocket 测试应用,Java EE 的 WebSocket API 中提供了配置器允许开发人员重写配置用来拦截检查协议握手过程。笔者在文章附录的源代码中已经包含了这部分代码,下面简单介绍一些核心类和配置。如果对 Java EE WebSocket API 不太熟悉的读者,建议可以先查阅相关规范。
public class CustomConfigurator extends ServerEndpointConfig.Configurator {
private static final String ORIGIN = "http://jeremy.laptop:8080";
@Override
public boolean checkOrigin(String originHeaderValue) {
if(originHeaderValue==null || originHeaderValue.trim().length()==0)
return true;
return ORIGIN.equals(originHeaderValue);
}
}
【第2步】 然后将该配置器关联到 WebSocket 服务器代码中。
清单 5. 配置 WebSocket 源检查:
@ServerEndpoint(value = "/query", configurator = CustomConfigurator.class)
public class WebSocketTestServer {
@OnMessage
public void onMessage(String message, Session session)
throws IOException, InterruptedException {
session.getBasicRemote().sendText("We got your query: " + message
+ "\nPlease wait for a while, we will response to you later.");
Thread.sleep(5000);
session.getBasicRemote().sendText("Sorry, we did not find the answer.");
}
}