精华内容
下载资源
问答
  • Websocket 简单来说websocket实现了双向通信,即服务端可以主动发送消息给客户端,客户端也可以主动发送消息给服务端 · Websocket与HTTP的区别 ● websocket中可以双向通信服务器端可以主动给客户端发送消息,http...

    Websocket

    简单来说websocket实现了双向通信,即服务端可以主动发送消息给客户端,客户端也可以主动发送消息给服务端

    ·

    Websocket与HTTP的区别

    ● websocket中可以双向通信服务器端可以主动给客户端发送消息,http只能客户端主动给服务端发送消息
    ● http客户端与服务端的通信必须建立在request和response,且一条response对应一条request
    ● websocket在连接时运用到了http中的tcp协议进行三次握手连接
    ● websocket是可持续状态的连接,而http是无状态连接

    ·

    Websocket与HTTP各自的优势

    ● 在客户端与服务端进行一段持续的会话时用websocket更好。如开启会话,监控,历史回放等
    ● 在客户端与服务端只需进行短暂的交互时用HTTP消耗的资源更少也更方便。如用户登录,查看数据页面等

    ·

    Websocket测试网址

    http://websocket.org/echo.html

    ·

    Websocket生命周期及代码实例

    后端

        @onOpen
        public void onOpen(Session session, EndpointConfig config){
        /* 当websocket连接成功后 */
        }
    
        @onClose
        public void onClose(Session session, CloseReason closeReason) {
            /* 当websocket发送消息发生错误时 */
        }
    
        @onError
        public void onError(Session session, Throwable throwable) {
            /* 当websocket连接关闭后 */
        }
        
    	@onMessage
        public void onMessage(String message) {
            /* 接收客户端发来的消息 */
        }
    }
    

    ·

    Websocket连接实例

    后端在controller层编写websocket连接的类可继承Endpoint

    @ServerEndpoint(
            value = "/url",
            configurator = xxxConfigurator.class // 配置类,通过配置类可以拿到初始连接时的request参数
    )
    @Component
    public class xxx extends Endpoint{
    	private RemoteEndpoint.Basic remote; // websocket发送消息
    	private ObjectMapper objectMapper;  // 可将json类型转换成字符串
    
    
    	@Override
        public void onOpen(Session session, EndpointConfig config) {
            System.out.println("连接成功");
            
    		// 通过config中可以得到初始连接时request参数
            System.out.println(config.getUserProperties().get("id"));
    
    		remote = session.getBasicRemote();
    		// 向前端发送数据
    		remote.sendText(String类型数据)
    		remote.sendText(objectMapper.writeValueAsString(json类型的数据))
    
        }
    
    	@OnMessage
        public void onMessage(String message){
            /* 从前端接收message消息 */
        }
    }
    
    

    配置Configurator类(可通过配置此类获取request请求参数)

    public class xxxConfigurator extends ServerEndpointConfig.Configurator {
        @Override
        public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        	// 可获取request中的请求参数的集合
            Map<String, List<String>> queryParam = request.getParameterMap();
            
            // 通过getUserProperties()使得websocket连接类中可获取到配置类中得到的数据
            Map<String, Object> userProperties = sec.getUserProperties();
            
            // 以获取get请求中的id参数为例
            userProperties.put("id", queryParam.get("id").get(0));
            super.modifyHandshake(sec, request, response);
        }
    }
    

    ·

    前端建立websocket连接

    	// 创建空数组接收数据
    	self.events = []
    	// 连接websocket
    	const socket = new WebSocket(`ws://localhost:8082/xxx?id=${this.$route.query.id}`)
    	// 从后端接收消息
        socket.onmessage = event => {
        	// 将后端收到的json类型强转后的的字符串强转成json类型,加入到events数组中
          self.events.push(JSON.parse(event.data));
        }
    
    展开全文
  • WebsocketConfig.java import org.springframework.context.annotation.Bean; import org.spring... } } 以上即为websocket获取HttpSession过程,下一篇实现普通类中获取Httpsession来获取对应的websocket Session。
    WebsocketConfig.java
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    import javax.servlet.http.HttpSession;
    import javax.websocket.HandshakeResponse;
    import javax.websocket.server.HandshakeRequest;
    import javax.websocket.server.ServerEndpointConfig;
    
    @Configuration
    public class WebSocketConfig extends ServerEndpointConfig.Configurator{
    
        /* 修改握手,就是在握手协议建立之前修改其中携带的内容 */
        @Override
        public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
            HttpSession httpSession = (HttpSession)request.getHttpSession();
            if (httpSession != null) {
                // 读取session域中存储的数据
                sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
            }
            super.modifyHandshake(sec, request, response);
        }
    
        @Bean
        public ServerEndpointExporter serverEndpointExporter(){
            return new ServerEndpointExporter();
        }
    }
    WebsocketListener.java
    
    import org.springframework.stereotype.Component;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    @Component
    public class WebsocketListener implements ServletRequestListener{
        @Override
        public void requestInitialized(ServletRequestEvent sre)  {
            HttpSession session = ((HttpServletRequest) sre.getServletRequest()).getSession();
        }
    
        public WebsocketListener(){}
    
        @Override
        public void requestDestroyed(ServletRequestEvent arg0)  {}
    }
    Websocket.java
    
    import org.springframework.stereotype.Component;
    import javax.servlet.http.HttpSession;
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.util.*;
    
    @ServerEndpoint(value = "/websocket",configurator = WebSocketConfig.class)
    @Component
    public class WebSocket {
    
        private Session session;
    
        @OnOpen
        public void onOpen(Session session,EndpointConfig config){
            HaigeSatContext.getInstance().getOnlineWebSocketSessions().add(session);
            System.out.println("-------------websocket open--------------");
            HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
            String httpSessionId = httpSession.getId();
            System.out.println("httpSessionId:"+httpSessionId);
            //此处省略使用sessionId构建hashMap集合存储websocket Session
    
        }
    
        @OnClose
        public void onClose(Session session){
            System.out.println("-------------websocket close--------------");
        }
    
        @OnMessage
        public void OnMessage(String message, Session session){
            System.out.println("-------------recv message--------------");
            System.out.println("message:"+message);
    
        }
    
        @OnError
        public void onError(Session session, Throwable error) {
            System.out.println("---------------websocket error-------------------------");
        }
    
    }

    以上即为websocket获取HttpSession过程,下一篇实现普通类中获取Httpsession来获取对应的websocket Session。

    展开全文
  • jmeter在websocket sampler中参数化了ticket,但是ticket总是报错无法使用 查看了服务器日志发现ticket中的=等于号被转成**%3D%3D**” 百度后找到的答案是用函数转一下ticket KaTeX parse error: Expected group ...

    jmeter在websocket sampler中参数化了ticket,但是ticket总是报错无法使用
    查看了服务器日志发现ticket中的=等于号被转成**%3D%3D**
    在这里插入图片描述
    百度后找到的答案是用函数转一下ticket
    KaTeX parse error: Expected group after '_' at position 2: {_̲_javaScript(enc…{token}’))}
    KaTeX parse error: Expected group after '_' at position 2: {_̲_urlencode('{token}’))}
    然并卵请求依旧没变,还望过大佬解答一下,谢谢!
    最后无奈,手动删除了文件中ticket后面的==

    转码问题已解决,去掉URL Encode的勾选就行了,感谢joey_2018_

    展开全文
  • //读取配置文件获取webSocketurl var wswebsocketUrl = data.webSocketUrl; var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { console.log(wswebsocketUrl); ...

    1、开发环境eclipse、tomcat7、jdk1.7

    2、pom jar包引用

        

    	<dependency>
    	     <groupId>javax</groupId>
    	     <artifactId>javaee-api</artifactId>
    	     <version>7.0</version>
    	     <scope>provided</scope>
    	</dependency>

    3、服务端

       

    @ServerEndpoint(value = "/websocket", configurator = GetHttpSessionConfigurator.class)
    public class SessionStatusWebSocket {
    
    	private static int onlineCount = 0;
    	// concurrent包的线程安全Set,用来存放每个客户端对应的webSocketSet对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    	private static CopyOnWriteArraySet<SessionStatusWebSocket> webSocketSet = new CopyOnWriteArraySet<SessionStatusWebSocket>();
    	// 一个会话可能造成
    	private static Map<String, HttpSession> socketNumb = new ConcurrentHashMap<String, HttpSession>();
    	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
    	private Session session;
    	// 整个会话
    	private HttpSession httpSession;
    
    	/**
    	 * 连接建立成功调用的方法
    	 * 
    	 * @param session
    	 *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
    	 */
    	@OnOpen
    	public void onOpen(Session session, EndpointConfig config) {
    		this.session = session;
    		this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
    		webSocketSet.add(this); // 加入set中
    		addOnlineCount(); // 连接数+1
    		System.out.println("有新连接加入!当前连接数为:" + getOnlineCount());
    	}
    
    	/**
    	 * 连接关闭调用的方法
    	 */
    	@OnClose
    	public void onClose() {
    		webSocketSet.remove(this); // 从set中删除
    		subOnlineCount(); // 在线数减1
    		System.out.println("有一连接关闭!当前连接数为:" + getOnlineCount());
    	}
    
    	/**
    	 * 收到客户端消息后调用的方法
    	 * 
    	 * @param message
    	 *            客户端发送过来的消息
    	 * @param session
    	 *            可选的参数
    	 */
    	@OnMessage
    	public void onMessage(String message, Session session) {
    		try {
    			sendMessage(message);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 发生错误时调用
    	 * 
    	 * @param session
    	 * @param error
    	 */
    	@OnError
    	public void onError(Session session, Throwable error) {
    		System.out.println("发生错误");
    		error.printStackTrace();
    	}
    
    	public void sendMessage(String message) throws IOException {
    		// 查询用户是否过期
    		String sessionToken = (String) httpSession.getAttribute("sid");
    		if (sessionToken != null) {
    			Integer userId = UmDBManager.webSocketCheckUserSessionToken(sessionToken);
    			if (userId == null) {
    				message = "0";// 用户正常退出
    			} else if (userId == 0) {
    				message = "1";// 该用户在其他地方登入
    			}
    		} else {
    			message = "2";// 服务器重启httpsession更改,但是客户端sid还在
    		}
    		this.session.getBasicRemote().sendText(message);
    	}
    
    	public static synchronized int getOnlineCount() {
    		return onlineCount;
    	}
    
    	public static synchronized void addOnlineCount() {
    		onlineCount = SessionStatusWebSocket.getOnlineCount();
    		onlineCount++;
    	}
    
    	public static synchronized void subOnlineCount() {
    		onlineCount = SessionStatusWebSocket.getOnlineCount();
    		onlineCount--;
    	}
    }

    4、GetHttpSessionConfigurator配置类获取httpsession

    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;
    
    public class GetHttpSessionConfigurator extends Configurator {
    
    	@Override
    	public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
    		HttpSession httpSession = (HttpSession) request.getHttpSession();
    		sec.getUserProperties().put(HttpSession.class.getName(), httpSession);
    	}
    }

    5、此时httpsession为null,需要配置拦截器在容器初始化时获取httpsession

    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpServletRequest;
    
    public class RequestListener implements ServletRequestListener {
    
    	@Override
    	public void requestDestroyed(ServletRequestEvent sre) {
    
    	}
    
    	public RequestListener() {
    
    	}
    
    	@Override
    	public void requestInitialized(ServletRequestEvent sre) {
    		// 将所有request请求都携带上httpSession
    		((HttpServletRequest) sre.getServletRequest()).getSession();
    	}
    
    }

    6、web监听器配置

    	<!--HttpSessionListener 监听器-->
    	<listener>
    	    <listener-class>包路径.RequestListener</listener-class>
    	</listener>

    7、前端连接测试

    //读取配置文件获取webSocketurl
            	var wswebsocketUrl = data.webSocketUrl;
                var websocket = null;
                //判断当前浏览器是否支持WebSocket
                if ('WebSocket' in window) {
                	console.log(wswebsocketUrl);
                    websocket = new WebSocket("ws://" + wswebsocketUrl);
                }
                else {
                    alert('当前浏览器 Not support websocket')
                }  
    
                //连接发生错误的回调方法
                websocket.onerror = function () {
                    setMessageInnerHTML("WebSocket连接发生错误");
                };
    
                //连接成功建立的回调方法
                websocket.onopen = function () {
                    setMessageInnerHTML("WebSocket连接成功");
                }
    
                //接收到消息的回调方法
                websocket.onmessage = function (event) {
                	var msg = event.data;
                	//业务处理逻辑
                    setMessageInnerHTML(event.data);
                }
    
                //连接关闭的回调方法
                websocket.onclose = function () {
                    setMessageInnerHTML("WebSocket连接关闭");
                    window.clearInterval(timer);
                }
    
                //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
                window.onbeforeunload = function () {
                    closeWebSocket();
                }
    
                //将消息显示在网页上
                function setMessageInnerHTML(innerHTML) {
                  // console.log(innerHTML);
                }
    
                //关闭WebSocket连接
                function closeWebSocket() {
                    websocket.close();
                }
    
                //发送消息
                function send() {
                	//var sid = $.cookie('sid'); //后台将httpOnly设置为false
                    websocket.send("登入状态");
                }
                
                var timer = setInterval(send, 1000);

     

    展开全文
  • spring websocket 获取httpsession

    万次阅读 2015-12-18 16:25:53
    spring4支持了websocket,但是关于如何将websocket session 和httpsession关联,没有找到好的方式,这里提供一个不太靠谱的办法,望指正
  • 参考了很多帖子,然后总是报空指针异常,最后从...1. 配置WebSocket @Configuration public class WebSocketConfig extends HttpSessionHandshakeInterceptor { @Bean public ServerEndpointExporter serverEndp...
  • } } } 然后就是Webscoket的onOpen方法中添加Session类型的参数,然后从Session对象中获取,这里的Session是 javax.websocket 包下的,不需要我们创建。代码如下: @OnOpen public void onOpen(Session session, ......
  • public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map, Object> attributes) throws Exception { System.out.println("Before ...
  • websocket获取HttpSession

    2021-01-01 22:52:04
    但由于socket并不是基于http协议的,所有需要经过一定的配置才能获取到HttpSession 将serverEndpointExporter添加到spring容器 只有这样websocket才能正常工作 @Bean public ServerEndpointExporter ...
  • 1.获取httpSession(因为项目需求,要获取ServletContext等) 解决办法:重写修改握手方法 import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; import javax.websocket.server....
  • public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { HttpSession httpSession = (HttpSession) request.getHttpSession(); sec....
  • 不过,为了方便以后使用,我也列一下另一种获取连接用户身份的方式——url参数。 有一点要格外注意,如果你的项目加了拦截器,或者用了security之类的安全框架,需要对websocket的路径放行,否则会一直报连接失败。...
  • websocket获取httpsession

    千次阅读 2019-05-27 23:01:54
    websocket有两个session 一个是自身的 一个是httpsession,由于WebSocket与Http协议的不同,故在使用常用的HttpSession方面就存在了一些问题。通过google翻阅到了在onOpen方法下使用HttpSession的方法 import javax....
  • <p>i'm trying to get a cookie just like what *http.Request do ( <code>r.Cookie("cookie_key")</code> ), how i can achieve this without connection Upgrade (pure ws) </div>
  • 根据RFC6455 文档 制作websocket server过程中,常常要得到首部url字符串,以便知道路由到哪里,参数是什么 http 请求字符串 格式 GET /live/1001 HTTP/1.1 Host: 127.0.0.1:9000 Connection: Upgrade Pragma: no-...
  • websocket有自带的Session,但是跟http的Session是不一样的,而我们做有些web项目的时候,又需要知道当前是哪个用户,用以处理该用户的业务逻辑,或者是对该用户进行授权之类的,所以必须需要获取并知道http的...
  •  在一个websocket请求建立之后,这个请求将会有一个websocket属性,用来给客户端提供一个简单的api通讯,如果request.is_websocket()是False,这个属性将是None。  3.WebSocket.wait()  返回一个客户端发送的信息...
  • WebSocket获取httpSession空指针异常的解决办法
  • 最近遇到了一个需求,根据不同用户的权限能接收不同的消息,在websocket获取用户信息的时候遇到了困难,发现了一篇写的很清楚的文章,记录一下。后面还有遇到的问题 原地址:...
  • webSocket获取httpsession

    2021-05-21 10:39:14
    websocket使用握手拦截器 public class HttpSessionHandshakeInterceptor extends org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake...
  • 名词解释: ...基于请求响应模型。 websocket,多次请求,只...socket.io,将Websocket和轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。 目的: 我...
  • WebSocket获取HttpSession

    千次阅读 2018-12-21 10:10:13
    由于WebSocket使用的协议有别于单纯的http,所以如果想要在WebSocket中直接获取HttpSession是无法获取的。需要想办法将HttpSession传入websocket中。  首先新建一个类继承Configurator import javax.servlet....
  • websocket获取不到shiro用户踩坑

    千次阅读 2019-02-19 14:56:18
    场景:websocket连接时 需要获取shiro用户并将其信息与session封装 当时踩坑获取不到用户,后来网上研究终于找到解决方案。 先配置WebSocketConfig @Configuration public class WebSocketConfig extends ...
  • 前言  websocket是一种html5新的接口,以前服务器推送需要进行ajax等方式进行轮训,对服务器压力较高,随着新标准的推进,使用... 使用websocket的时候,前端使用是比较规范的,js支持ws协议,感觉上类似于一...
  • websocket获取httpsession

    千次阅读 2019-03-06 10:44:52
    1.新建 public class HttpSessionConfigurator extends Configurator { ... public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,594
精华内容 7,837
关键字:

websocket获取request