From a80afab862cf5646159173f67cc5728c47cbfc80 Mon Sep 17 00:00:00 2001
From: luoxiang <2806718453@qq.com>
Date: Thu, 27 Dec 2018 21:33:02 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20websocket=20?=
=?UTF-8?q?=E7=94=A8=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 1 +
README.md | 16 ++--
spring/spring-websocket-annotation/pom.xml | 73 ++++++++++++++++++
.../com/heibaiying/constant/Constant.java | 11 +++
.../controller/LoginController.java | 23 ++++++
.../DispatcherServletInitializer.java | 23 ++++++
.../heibaiying/webconfig/ServletConfig.java | 42 ++++++++++
.../webconfig/characterEncodingFilter.java | 21 +++++
.../websocket/CustomHandshakeInterceptor.java | 32 ++++++++
.../heibaiying/websocket/CustomerHandler.java | 60 ++++++++++++++
.../heibaiying/websocket/WebSocketConfig.java | 21 +++++
.../src/main/webapp/WEB-INF/jsp/chat.jsp | 38 +++++++++
.../src/main/webapp/index.jsp | 12 +++
.../com/heibaiying/constant/Constant.class | Bin 0 -> 200 bytes
.../controller/LoginController.class | Bin 0 -> 896 bytes
.../CustomHandshakeInterceptor.class | Bin 0 -> 1791 bytes
.../websocket/CustomerHandler.class | Bin 0 -> 3854 bytes
.../WEB-INF/classes/springApplication.xml | 45 +++++++++++
.../WEB-INF/jsp/chat.jsp | 38 +++++++++
.../WEB-INF/web.xml | 41 ++++++++++
.../spring_websocket_Web_exploded/index.jsp | 12 +++
spring/spring-websocket/pom.xml | 5 ++
.../com/heibaiying/constant/Constant.java | 11 +++
.../controller/LoginController.java | 23 ++++++
.../websocket/CustomHandshakeInterceptor.java | 19 +++--
.../heibaiying/websocket/CustomerHandler.java | 50 ++++++++++--
.../src/main/webapp/WEB-INF/jsp/chat.jsp | 38 +++++++++
.../src/main/webapp/WEB-INF/web.xml | 18 +++++
.../src/main/webapp/index.jsp | 33 +-------
29 files changed, 655 insertions(+), 51 deletions(-)
create mode 100644 spring/spring-websocket-annotation/pom.xml
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/constant/Constant.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/controller/LoginController.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/DispatcherServletInitializer.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/ServletConfig.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/characterEncodingFilter.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomerHandler.java
create mode 100644 spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/WebSocketConfig.java
create mode 100644 spring/spring-websocket-annotation/src/main/webapp/WEB-INF/jsp/chat.jsp
create mode 100644 spring/spring-websocket-annotation/src/main/webapp/index.jsp
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/constant/Constant.class
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/controller/LoginController.class
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/websocket/CustomHandshakeInterceptor.class
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/websocket/CustomerHandler.class
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/springApplication.xml
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/jsp/chat.jsp
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/web.xml
create mode 100644 spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/index.jsp
create mode 100644 spring/spring-websocket/src/main/java/com/heibaiying/constant/Constant.java
create mode 100644 spring/spring-websocket/src/main/java/com/heibaiying/controller/LoginController.java
create mode 100644 spring/spring-websocket/src/main/webapp/WEB-INF/jsp/chat.jsp
diff --git a/.gitignore b/.gitignore
index 2da1a73..23646f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,7 @@ manifest.yml
overridedb.*
settings.xml
target
+classes
out
transaction-logs
.flattened-pom.xml
diff --git a/README.md b/README.md
index f113b22..f1035cb 100644
--- a/README.md
+++ b/README.md
@@ -31,15 +31,15 @@ spring-cloud:Finchley.SR2
| [spring-jdbc](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc)
[spring-jdbc-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc-annotation) | spring jdbc-template 的使用 | [Using JdbcTemplat](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate) |
| [spring-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis)
[spring-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis-annotation) | spring 整合 mybatis | [mybatis-spring中文文档](http://www.mybatis.org/spring/zh/index.html) |
| [spring-druid-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis)
[spring-druid-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis-annotation) | spring 整合druid、mybatis | [alibaba druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) |
-| spring-redis
spring-redis-annotation | spring 整合 redis 单机、集群(jedis客户端)
spring 整合 redis 单机、集群(redisson客户端) | [redisson中文文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) |
+| spring-redis
spring-redis-annotation | spring 整合 redis 单机、集群(jedis客户端)
spring 整合 redis 单机、集群(redisson客户端) | [redisson官方中文文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) |
| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | [Spring Data MongoDB](https://docs.spring.io/spring-data/mongodb/docs/2.1.3.RELEASE/reference/html/#mongo.mongo-db-factory-java) |
-| spring-memcached
spring-memcached-annotation | spring 整合 memcached(单机、集群) | [Xmemcached中文文档](https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97) |
-| spring-rabbitmq
spring-rabbitmq-annotation | spring 整合 rabbitmq | |
+| spring-memcached
spring-memcached-annotation | spring 整合 memcached(单机、集群) | [Xmemcached官方中文文档](https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97) |
+| spring-rabbitmq
spring-rabbitmq-annotation | spring 整合 rabbitmq、消息序列化与反序列化 | [rabbitmq 官方文档](http://www.rabbitmq.com/getstarted.html)
[spring amqp](https://docs.spring.io/spring-amqp/docs/2.1.3.BUILD-SNAPSHOT/reference/html/) |
| spring-kafka
spring-kafka-annotation | spring 整合 kafka | |
-| spring-dubbo
spring-dubbo-annotation | spring 整合 dubbo | |
-| spring-websocket
spring-websocket-annotation | spring 整合 websocket | |
-| spring-netty
spring-netty-annotation | spring 整合 netty | |
-| spring-scheduled
spring-scheduled-annotation | spring 定时任务 | |
+| spring-dubbo
spring-dubbo-annotation | spring 整合 dubbo | [duboo 官方中文文档](http://dubbo.apache.org/zh-cn/docs/user/quick-start.html) |
+| spring-websocket
spring-websocket-annotation | spring 整合 websocket | [spring websocket](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/web.html#websocket) |
+| spring-mail
spring-mail-annotation | spring 普通文本邮件、附件邮件、模板邮件 | [spring email](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/integration.html#mail) |
+| spring-scheduled
spring-scheduled-annotation | spring 定时任务 | [Task Execution and Scheduling](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/integration.html#scheduling) |
@@ -83,8 +83,6 @@ spring-cloud:Finchley.SR2
| spring-cloud-zuul | spring cloud 网关限流、权限验证 | |
| spring-cloud-sleuth-Zipkin | spring cloud 服务追踪 | |
-推荐课程:[Spring Cloud微服务实战](https://coding.imooc.com/class/187.html) 廖大神结合实战,很详细的介绍spring cloud各个组件的使用。
-
## 4.参考资料
diff --git a/spring/spring-websocket-annotation/pom.xml b/spring/spring-websocket-annotation/pom.xml
new file mode 100644
index 0000000..1a4c08d
--- /dev/null
+++ b/spring/spring-websocket-annotation/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-websocket
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
+
+
+
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+ commons-codec
+ commons-codec
+ 1.9
+
+
+
+ org.springframework
+ spring-websocket
+ 5.1.3.RELEASE
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/constant/Constant.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/constant/Constant.java
new file mode 100644
index 0000000..a3417e6
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/constant/Constant.java
@@ -0,0 +1,11 @@
+package com.heibaiying.constant;
+
+/**
+ * @author : 罗祥
+ * @description :
+ * @date :create in 2018/12/27
+ */
+public interface Constant {
+
+ String USER_NAME="username";
+}
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/controller/LoginController.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/controller/LoginController.java
new file mode 100644
index 0000000..f7c2276
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/controller/LoginController.java
@@ -0,0 +1,23 @@
+package com.heibaiying.controller;
+
+import com.heibaiying.constant.Constant;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ * @author : 罗祥
+ * @description : 简单登录
+ * @date :create in 2018/12/27
+ */
+@Controller
+public class LoginController {
+
+ @PostMapping("login")
+ public String login(String username, HttpSession session){
+ session.setAttribute(Constant.USER_NAME,username);
+ return "chat";
+ }
+}
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/DispatcherServletInitializer.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/DispatcherServletInitializer.java
new file mode 100644
index 0000000..000b86f
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/DispatcherServletInitializer.java
@@ -0,0 +1,23 @@
+package com.heibaiying.webconfig;
+
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+/**
+ * @author : 罗祥
+ * @description : 等价于 web.xml 中配置前端控制器
+ * @date :create in 2018/12/27
+ */
+public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
+
+ protected Class>[] getRootConfigClasses() {
+ return new Class[0];
+ }
+
+ protected Class>[] getServletConfigClasses() {
+ return new Class[]{ServletConfig.class};
+ }
+
+ protected String[] getServletMappings() {
+ return new String[]{"/"};
+ }
+}
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/ServletConfig.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/ServletConfig.java
new file mode 100644
index 0000000..af45804
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/ServletConfig.java
@@ -0,0 +1,42 @@
+package com.heibaiying.webconfig;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+
+/**
+ * @author : 罗祥
+ * @description : 主配置类
+ * @date :create in 2018/12/27
+ */
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = {"com.heibaiying.*"})
+public class ServletConfig implements WebMvcConfigurer {
+
+
+ /**
+ * 配置视图解析器
+ */
+ @Bean
+ public ViewResolver viewResolver() {
+ InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
+ internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
+ internalResourceViewResolver.setSuffix(".jsp");
+ internalResourceViewResolver.setExposeContextBeansAsAttributes(true);
+ return internalResourceViewResolver;
+ }
+
+ /**
+ * 配置静态资源处理器
+ */
+ public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+ configurer.enable();
+ }
+
+}
\ No newline at end of file
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/characterEncodingFilter.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/characterEncodingFilter.java
new file mode 100644
index 0000000..0958a33
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/webconfig/characterEncodingFilter.java
@@ -0,0 +1,21 @@
+package com.heibaiying.webconfig;
+
+import org.springframework.web.filter.CharacterEncodingFilter;
+
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.annotation.WebInitParam;
+
+/**
+ * @author : 罗祥
+ * @description : 编码过滤器 防止乱码
+ * @date :create in 2018/12/27
+ */
+@WebFilter(filterName = "characterEncodingFilter", urlPatterns = "/*",
+ initParams = {
+ @WebInitParam(name = "encoding", value = "UTF-8"),
+ @WebInitParam(name = "forceEncoding", value = "true")
+ }
+)
+public class characterEncodingFilter extends CharacterEncodingFilter {
+
+}
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
new file mode 100644
index 0000000..e845c54
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
@@ -0,0 +1,32 @@
+package com.heibaiying.websocket;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.Map;
+
+/**
+ * @author : heibaiying
+ * @description : 可以按照需求实现权限拦截等功能
+ */
+public class CustomHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
+
+ @Override
+ public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map 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);
+ }
+}
+
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomerHandler.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomerHandler.java
new file mode 100644
index 0000000..4dca73a
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/CustomerHandler.java
@@ -0,0 +1,60 @@
+package com.heibaiying.websocket;
+
+import com.heibaiying.constant.Constant;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author : heibaiying
+ * @description : 自定义消息处理类
+ */
+public class CustomerHandler extends TextWebSocketHandler {
+
+ private Map nameAndSession = new ConcurrentHashMap<>();
+
+ // 建立连接时候触发
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) {
+ String username = getNameFromSession(session);
+ nameAndSession.putIfAbsent(username, session);
+ }
+
+
+ // 关闭连接时候触发
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+ String username = getNameFromSession(session);
+ nameAndSession.remove(username);
+ }
+
+ // 处理消息
+ @Override
+ protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+ // 防止中文乱码
+ String msg = URLDecoder.decode(message.getPayload(), "utf-8");
+ String username = getNameFromSession(session);
+ // 简单模拟群发消息
+ TextMessage reply = new TextMessage(username + " : " + msg);
+ nameAndSession.forEach((s, webSocketSession)
+ -> {
+ try {
+ webSocketSession.sendMessage(reply);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+
+ private String getNameFromSession(WebSocketSession session) {
+ Map attributes = session.getAttributes();
+ return (String) attributes.get(Constant.USER_NAME);
+ }
+}
diff --git a/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/WebSocketConfig.java b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/WebSocketConfig.java
new file mode 100644
index 0000000..7854d56
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/java/com/heibaiying/websocket/WebSocketConfig.java
@@ -0,0 +1,21 @@
+package com.heibaiying.websocket;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+/**
+ * @author : 罗祥
+ * @description :websocket 配置
+ * @date :create in 2018/12/27
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ registry.addHandler(new CustomerHandler(), "/socket").addInterceptors(new CustomHandshakeInterceptor());
+ }
+}
diff --git a/spring/spring-websocket-annotation/src/main/webapp/WEB-INF/jsp/chat.jsp b/spring/spring-websocket-annotation/src/main/webapp/WEB-INF/jsp/chat.jsp
new file mode 100644
index 0000000..a479696
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/webapp/WEB-INF/jsp/chat.jsp
@@ -0,0 +1,38 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ ${sessionScope.get("username")}您好!欢迎进入群聊大厅!
+
+
+
+
+
+
+
+
+
+
diff --git a/spring/spring-websocket-annotation/src/main/webapp/index.jsp b/spring/spring-websocket-annotation/src/main/webapp/index.jsp
new file mode 100644
index 0000000..507abb5
--- /dev/null
+++ b/spring/spring-websocket-annotation/src/main/webapp/index.jsp
@@ -0,0 +1,12 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Title
+
+
+
+
+
diff --git a/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/constant/Constant.class b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/com/heibaiying/constant/Constant.class
new file mode 100644
index 0000000000000000000000000000000000000000..a67e95dadd05e1a10cb41b2c06bae96702993843
GIT binary patch
literal 200
zcmX^0Z`VEs1_l!b9(D#!b_Om+2F}o6*PwVmM_*S)1|grU#Ii*FoW#6z{os%$cMtJV4pc_eykkBPLi1kA4`=Ab*l7;
zXGVK#@?2V;n32+Z=XRf=o(C7h{&sRKW`gH}7z1yK*e^XFxs!I5OV7vNPx(t)2GTiY
zbicPqVQ3bF*J4s;xgg09xjCDm`#*h#jkksNY9fcqDJpbVYvYBd*i`4U#Mlvc(~#)P{}sb|
zX{GU}Q_276WsD|PsH(;8J1?{k(DEn3-5B?9pT?Vwg=gq3GM3DXq5Zp~uhV0h5q&eb
zmQRTxcGB;98fjX1D)r&ANzZ3Lm+kk4*g}JDYIrK3xnhOZ7FnEjMtl9y7qHLe@hYv2
z(%D8#|M47v3%E!Y-C(pyB#;kKrI!$oJJp@9s8!Laeax43|Hy9b_nJuRt48f#f|bb|;ef##g=k`6fzyJLD4Zs2(tLVn9Uff1bMIMtqn8LJ*
z8O-_{x`I0j<`|O8mTk!uhFC7Y#SmY0Dx4uzv~2#|YnWWTGR!(z28vGEsBam<^4F0u
zE^C&{uvjcR4ZX%K)36RKyQ=SV({;+bTb4aiN!j-x^sq`CE^>vT&{=Zqu<{-uVpC
z)+64pxmgM_@X6J=C=_>$Jwx}TRo6F+W+DHEK@lMVhWT?*2w5|93m&pzSU49zlmkQ0
zz8mplnCl2}R!R)2A*HZPPjaea>QssheS$X}$)8jz#FRY7LJynjx=urQLD4RiQ!#!!
z4!1iVy9~Fh=%D#qNsH~lm&0Y44N#cajUMR
z>`qb6d=ePaRW3K%)jOWcx6AUhen*4o9o0=YPk^mP7ftnl=43Z(;A@&>)Ejwcz0
z!r+#pza%|NQZ+Xkq~I{;b~E*o{{qUoP3LkadLdGNehXPB^o;vo7fAL{Y3!wyPJc%K
z#N-j!r(j#7F&P-s=%cw7I^Y6Qw4%F0KVre*_ec;dke&L1E{3HEd+{!5F~jH27$BWJw&X1o9`bBW+TWD
sQa6pGxJ)!sUcr$w)Ggw)Fje
zzxxyVwRBo&V5Za0o&Kgy&q|7|BtRye=?BZZtGoA}d+)h-SAYF;=MMk}@M992a7x27
zNyKn!1vVm=Dv9+lHC)y(EwIuus&dFG<)!PIwk6P+yKG!FGIh_aWX6nI
zR$xWmEL(Vnl;cC@6V@u+VZYBAuZdst!k+sT<
zKyu`IQPvbWTn!awr7XR1=4aHgtBqYikn*UV@6Ol^+o2bZqC
zCUZ^~E|c4Sd9AM))k4YGwkRLl_6j&lx)6=hV(?3GVo|{>N(oY7b)d_%Gbc|sV$IqV
z3_*&;JFiU$bdZt7X|^Q4?AgbdqP$&qigMIcy`g(SmG4oZ(6I$u1$H!hTG6(Ob;psG
zmtpyb!xM%(Ma?=k<6#|H9MMqKVZqi>!xbG46sBfugI-6j)V;}p!x}stbzEf+TB7+y
zA}O$Tp}u2vvr>|dj%&D1Huenm=$OH)%7@oz{+MlhuICuFG3ia&CATwy*HgH`zc*5N
zQ^#9)TgN+iSHpWc-p2<5JqtP_eP<~Lp8EqGA1e1g!p8!ud^q#7q2m)3zTO3T?%P=f
zvP(oDprDgck!Ua@?8|c){KnT{1T){v9+M={UaNa2Cx;3ylPGYwH^Rw~^ov)bRTm1e
zu{pA8UnO^T+(XAbcO=;a&KNTl+hFVM?!Bi>5J-z>-MO>58=@MArwk`AuhgYglx(R0OS6>ZXX
zMvNjG$(9i7eT7xe$}B)$oJB_WQt^?~lOd2g~6R@_!R=;ez*ho+te8;Vj1W1jjs&_}s>o
zqiEp>NcG)@=(~&9#oK844e^`4^mabg7Xh#eajeD;j`TntJJHLTz%KNKx-L>zi<0fz
zeH*P~eZL~!zk3#m7F=kmTj`6eCyWh96Qokv6Ko4rDr39RPo)WdPz+!X0g(9E8=5I_
z9_OyKZ)RMX8JL9@TWnCg%_VITHWYl6-xdo7fFlwU*BZ2nNIOBz~3!&-9~z_Rl!@=dWSw?
z7Tqy4Be4dpKB^Al=%(F+v^;`CKGvgw#Rk^V2G&u^9U`(0JdVeFtlh+}P{;YE3y1l(
zmG8j0z#t`glL#YM=FCqJv$C44tUtYW77xWhr+(&!7Burc2#p&blpKx0dV0cpQof^9fE13?d7r}!Uq7vl`g&vhoP9b@;S-$3a1!6}KS{x_@EyL!I=sla
NBJ)d>c^R+Z(!X%uE|35K
literal 0
HcmV?d00001
diff --git a/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/springApplication.xml b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/springApplication.xml
new file mode 100644
index 0000000..80023cc
--- /dev/null
+++ b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/classes/springApplication.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/jsp/chat.jsp b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/jsp/chat.jsp
new file mode 100644
index 0000000..a479696
--- /dev/null
+++ b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/jsp/chat.jsp
@@ -0,0 +1,38 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ ${sessionScope.get("username")}您好!欢迎进入群聊大厅!
+
+
+
+
+
+
+
+
+
+
diff --git a/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/web.xml b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/web.xml
new file mode 100644
index 0000000..7bb4250
--- /dev/null
+++ b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/WEB-INF/web.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+ springMvc
+ org.springframework.web.servlet.DispatcherServlet
+
+ contextConfigLocation
+ classpath:springApplication.xml
+
+ 1
+
+
+
+ springMvc
+ /
+
+
+
+ characterEncodingFilter
+ org.springframework.web.filter.CharacterEncodingFilter
+
+ encoding
+ UTF-8
+
+
+ forceEncoding
+ true
+
+
+
+ characterEncodingFilter
+ /*
+
+
+
\ No newline at end of file
diff --git a/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/index.jsp b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/index.jsp
new file mode 100644
index 0000000..507abb5
--- /dev/null
+++ b/spring/spring-websocket/classes/artifacts/spring_websocket_Web_exploded/index.jsp
@@ -0,0 +1,12 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Title
+
+
+
+
+
diff --git a/spring/spring-websocket/pom.xml b/spring/spring-websocket/pom.xml
index efadbc9..1a4c08d 100644
--- a/spring/spring-websocket/pom.xml
+++ b/spring/spring-websocket/pom.xml
@@ -57,6 +57,11 @@
4.0.1
provided
+
+ commons-codec
+ commons-codec
+ 1.9
+
org.springframework
diff --git a/spring/spring-websocket/src/main/java/com/heibaiying/constant/Constant.java b/spring/spring-websocket/src/main/java/com/heibaiying/constant/Constant.java
new file mode 100644
index 0000000..a3417e6
--- /dev/null
+++ b/spring/spring-websocket/src/main/java/com/heibaiying/constant/Constant.java
@@ -0,0 +1,11 @@
+package com.heibaiying.constant;
+
+/**
+ * @author : 罗祥
+ * @description :
+ * @date :create in 2018/12/27
+ */
+public interface Constant {
+
+ String USER_NAME="username";
+}
diff --git a/spring/spring-websocket/src/main/java/com/heibaiying/controller/LoginController.java b/spring/spring-websocket/src/main/java/com/heibaiying/controller/LoginController.java
new file mode 100644
index 0000000..f7c2276
--- /dev/null
+++ b/spring/spring-websocket/src/main/java/com/heibaiying/controller/LoginController.java
@@ -0,0 +1,23 @@
+package com.heibaiying.controller;
+
+import com.heibaiying.constant.Constant;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ * @author : 罗祥
+ * @description : 简单登录
+ * @date :create in 2018/12/27
+ */
+@Controller
+public class LoginController {
+
+ @PostMapping("login")
+ public String login(String username, HttpSession session){
+ session.setAttribute(Constant.USER_NAME,username);
+ return "chat";
+ }
+}
diff --git a/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java b/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
index 5dae0f5..e845c54 100644
--- a/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
+++ b/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomHandshakeInterceptor.java
@@ -5,24 +5,27 @@ import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Map;
/**
* @author : heibaiying
- * @description : 握手拦截器
+ * @description : 可以按照需求实现权限拦截等功能
*/
public class CustomHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
- /*@Override
- public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {
- InetSocketAddress remoteAddress = request.getRemoteAddress();
- System.out.println(remoteAddress);
- return true;
- }*/
-
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map 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);
}
}
diff --git a/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomerHandler.java b/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomerHandler.java
index 5b52723..6ee4e2e 100644
--- a/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomerHandler.java
+++ b/spring/spring-websocket/src/main/java/com/heibaiying/websocket/CustomerHandler.java
@@ -1,21 +1,61 @@
package com.heibaiying.websocket;
+import com.heibaiying.constant.Constant;
+import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
-import java.time.LocalDateTime;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* @author : heibaiying
- * @description : 自定义消息处理器
+ * @description : 自定义消息处理类
*/
public class CustomerHandler extends TextWebSocketHandler {
+ private Map nameAndSession = new ConcurrentHashMap<>();
+
+ // 建立连接时候触发
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) {
+ String username = getNameFromSession(session);
+ nameAndSession.putIfAbsent(username, session);
+ }
+
+
+ // 关闭连接时候触发
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+ String username = getNameFromSession(session);
+ nameAndSession.remove(username);
+ }
+
+ // 处理消息
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
- String stringMessage = new String(message.asBytes());
- System.out.println("服务端收到消息:" + stringMessage);
- session.sendMessage(new TextMessage(stringMessage+LocalDateTime.now()));
+ // 防止中文乱码
+ String msg = URLDecoder.decode(message.getPayload(), "utf-8");
+ String username = getNameFromSession(session);
+ // 简单模拟群发消息
+ TextMessage reply = new TextMessage(username + " : " + msg);
+ nameAndSession.forEach((s, webSocketSession)
+ -> {
+ try {
+ webSocketSession.sendMessage(reply);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+
+ private String getNameFromSession(WebSocketSession session) {
+ Map attributes = session.getAttributes();
+ return (String) attributes.get(Constant.USER_NAME);
}
}
diff --git a/spring/spring-websocket/src/main/webapp/WEB-INF/jsp/chat.jsp b/spring/spring-websocket/src/main/webapp/WEB-INF/jsp/chat.jsp
new file mode 100644
index 0000000..a479696
--- /dev/null
+++ b/spring/spring-websocket/src/main/webapp/WEB-INF/jsp/chat.jsp
@@ -0,0 +1,38 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ ${sessionScope.get("username")}您好!欢迎进入群聊大厅!
+
+
+
+
+
+
+
+
+
+
diff --git a/spring/spring-websocket/src/main/webapp/WEB-INF/web.xml b/spring/spring-websocket/src/main/webapp/WEB-INF/web.xml
index c5e8f38..d64fe9d 100644
--- a/spring/spring-websocket/src/main/webapp/WEB-INF/web.xml
+++ b/spring/spring-websocket/src/main/webapp/WEB-INF/web.xml
@@ -21,4 +21,22 @@
/
+
+
+ characterEncodingFilter
+ org.springframework.web.filter.CharacterEncodingFilter
+
+ encoding
+ UTF-8
+
+
+ forceEncoding
+ true
+
+
+
+ characterEncodingFilter
+ /*
+
+
\ No newline at end of file
diff --git a/spring/spring-websocket/src/main/webapp/index.jsp b/spring/spring-websocket/src/main/webapp/index.jsp
index 1f75321..507abb5 100644
--- a/spring/spring-websocket/src/main/webapp/index.jsp
+++ b/spring/spring-websocket/src/main/webapp/index.jsp
@@ -4,34 +4,9 @@
Title
-
-
-
-
-
-
+