文章目录
前言
tomcat和jetty都遵循JSR 356的注解规范. 如果是采用interface继承的方式, jetty的websocket无法使用.
但是jetty自己实现了一套新的注解和接口.
JSR 356的规范有个缺陷, 没有获取IP的接口, 需要特殊实现
示例代码
https://github.com/wzjwhut/websocket
JSR 356注解方式实现
@ServerEndpoint声明
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.websocket.EndpointConfig;
import javax.websocket.HandshakeResponse;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpoint;
import javax.websocket.server.ServerEndpointConfig;
import java.io.IOException;
@Component
@Log4j2
@ServerEndpoint(value = "/echo1",
configurator=WebSocketAnnotationDemo.Configurator.class,
subprotocols={
"device", "user"})
public class WebSocketAnnotationDemo {
//每当有一个新的连接时, 都会创建新的WebSocketAnnotationDemo
public static class Configurator extends ServerEndpointConfig.Configurator{
@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request,
HandshakeResponse response) {
log.info("modifyHandshake: {}", request.getRequestURI());
HttpSession httpSession = (HttpSession) request.getHttpSession();
String ip = (String) httpSession.getAttribute("getRemoteAddr");
if(ip != null) {
config.getUserProperties().put("getRemoteAddr", ip);
}
}
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info("onMessage: {}", message);
}
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
log.info("onOpen: {}, this: {}, {}", session.getClass(), this.hashCode(), session.getNegotiatedSubprotocol());
log.info("uri: {}", session.getRequestURI