@Test public void doNotCauseSessionCreation() throws Exception { Map<String, Object> attributes = new HashMap<>(); WebSocketHandler wsHandler = Mockito.mock(WebSocketHandler.class); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); interceptor.beforeHandshake(this.request, this.response, wsHandler, attributes); assertNull(this.servletRequest.getSession(false)); }
@Test public void constructorWithAttributeNames() throws Exception { Map<String, Object> attributes = new HashMap<>(); WebSocketHandler wsHandler = Mockito.mock(WebSocketHandler.class); this.servletRequest.setSession(new MockHttpSession(null, "123")); this.servletRequest.getSession().setAttribute("foo", "bar"); this.servletRequest.getSession().setAttribute("bar", "baz"); Set<String> names = Collections.singleton("foo"); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(names); interceptor.beforeHandshake(this.request, this.response, wsHandler, attributes); assertEquals(2, attributes.size()); assertEquals("bar", attributes.get("foo")); assertEquals("123", attributes.get(HttpSessionHandshakeInterceptor.HTTP_SESSION_ID_ATTR_NAME)); }
@Test public void doNotCopyHttpSessionId() throws Exception { Map<String, Object> attributes = new HashMap<>(); WebSocketHandler wsHandler = Mockito.mock(WebSocketHandler.class); this.servletRequest.setSession(new MockHttpSession(null, "123")); this.servletRequest.getSession().setAttribute("foo", "bar"); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); interceptor.setCopyHttpSessionId(false); interceptor.beforeHandshake(this.request, this.response, wsHandler, attributes); assertEquals(1, attributes.size()); assertEquals("bar", attributes.get("foo")); }
@Test public void doNotCopyAttributes() throws Exception { Map<String, Object> attributes = new HashMap<>(); WebSocketHandler wsHandler = Mockito.mock(WebSocketHandler.class); this.servletRequest.setSession(new MockHttpSession(null, "123")); this.servletRequest.getSession().setAttribute("foo", "bar"); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); interceptor.setCopyAllAttributes(false); interceptor.beforeHandshake(this.request, this.response, wsHandler, attributes); assertEquals(1, attributes.size()); assertEquals("123", attributes.get(HttpSessionHandshakeInterceptor.HTTP_SESSION_ID_ATTR_NAME)); }
@Test public void defaultConstructor() throws Exception { Map<String, Object> attributes = new HashMap<>(); WebSocketHandler wsHandler = Mockito.mock(WebSocketHandler.class); this.servletRequest.setSession(new MockHttpSession(null, "123")); this.servletRequest.getSession().setAttribute("foo", "bar"); this.servletRequest.getSession().setAttribute("bar", "baz"); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); interceptor.beforeHandshake(this.request, this.response, wsHandler, attributes); assertEquals(3, attributes.size()); assertEquals("bar", attributes.get("foo")); assertEquals("baz", attributes.get("bar")); assertEquals("123", attributes.get(HttpSessionHandshakeInterceptor.HTTP_SESSION_ID_ATTR_NAME)); }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { return super.beforeHandshake(request, response, wsHandler, attributes); }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { System.out.println("连接成功之前的拦截器1"); return super.beforeHandshake(request, response, wsHandler, attributes); }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { InetSocketAddress remoteAddress = request.getRemoteAddress(); InetAddress address = remoteAddress.getAddress(); System.out.println(address); /* * 最后需要要显示调用父类方法,父类的beforeHandshake方法 * 把ServerHttpRequest 中session中对应的值拷贝到WebSocketSession中。 * 如果我们没有实现这个方法,我们在最后的handler处理中 是拿不到 session中的值 * 作为测试 可以注释掉下面这一行 可以发现自定义处理器中session的username总是为空 */ return super.beforeHandshake(request, response, wsHandler, attributes); } }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) { logger.info("WebSocket Handshake Before: " + request.getURI()); try { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; // 获取凭证ID,检查用户是否登录 String principalId = getPrincipalId(servletRequest.getServletRequest()); // 从Session中获取CookieId(无法从Header中获取) String token = LoginUserUtils.getTokenFromSession(servletRequest.getServletRequest()); logger.debug("WebSocket PrincipalId [{}]", principalId); logger.debug("WebSocket Token [{}]", token); attributes.put("principalId", principalId); attributes.put("token", token); return super.beforeHandshake(request, response, wsHandler, attributes); } } catch (LoginInvalidException e) { logger.warn("WebSocket Handshake Error(登录失效,握手失败)"); return false; } catch (Exception e) { logger.warn("WebSocket Handshake Error({})", e.getMessage()); logger.error(e.getMessage(), e); return false; } return false; }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { //解决The extension [x-webkit-deflate-frame] is not supported问题 if(request.getHeaders().containsKey("Sec-WebSocket-Extensions")) { request.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate"); } ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(); if (session != null) { //使用user区分WebSocketHandler,以便定向发送消息 HttpServletRequest req = servletRequest.getServletRequest(); String name = req.getParameter("name"); System.out.println(JSON.toJSONString(req.getParameterNames())); if(null != name && !"".equals(name)){ attributes.put("user", name); } } } return super.beforeHandshake(request, response, wsHandler, attributes); }
@Override public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { super.beforeHandshake(serverHttpRequest, serverHttpResponse, wsHandler, attributes); HttpSession httpSession = getRequestSession(serverHttpRequest); if (httpSession == null) { throw new HandshakeFailureException("Can not get HttpSession"); } ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) serverHttpRequest; HttpServletRequest request = servletRequest.getServletRequest(); request.getParameterMap().forEach( (k, v) -> { if (v.length == 1) { String t = v[0]; attributes.put(k, t); } else { attributes.put(k, v); } } ); String uuid = UUID.randomUUID().toString().replaceAll("-",""); attributes.put(SESSION_ID,uuid); try { securityCheckManager.check(servletRequest); } catch (HandshakeFailureException e) { logger.warn("handshake failed: {}", e.getMessage()); return false; } return true; }
attributes.put(GRANTS, grants); return super.beforeHandshake(request, response, wsHandler, attributes);