spring3.0+spring mvc3.0+spring security3.0整合spring websocket

来源:互联网 发布:linux改变文件权限命令 编辑:程序博客网 时间:2024/06/07 22:38

在项目过程中,由于需求在spring3.0+的框架基础上整合spring-websocket。而spring-wesocket是spring4.0+才有的。

  1. 升级原spring框架核心包到4.0+。这里我选择4.1.8
    <spring.version>4.1.8.RELEASE</spring.version>

    <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency>
    升级后先修改配置文件及项目中由于spring框架变动而引起的class类变动,列:
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean>

    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean>
    MappingJacksonHttpMessageConverter变更为MappingJackson2HttpMessageConverter
    并增加spring4.0+的依赖jar
    <jackson.version>2.5.0</jackson.version>

    <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-core</artifactId>            <version>${jackson.version}</version>        </dependency>        <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-databind</artifactId>            <version>${jackson.version}</version>        </dependency>        <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-annotations</artifactId>            <version>${jackson.version}</version>        </dependency>

    改动后启动项目,项目可正常启动。
  2. 添加spring-websocket到
    <dependency>  <groupId>org.springframework</groupId>          <artifactId>spring-websocket</artifactId>          <version>${spring.version}</version>  </dependency>
    编写websocket相关类。注册websocket
    @Configuration@EnableWebMvc@EnableWebSocketpublic class WebsocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer  {@Beanpublic WebsocketHandler jwyWebSocketHandler(){return new MyHandler();}@Beanpublic WebsocketHandShake jwyWebSocketHandShake(){return new WebsocketHandShake();}@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {System.out.println("------websocket注册-----");registry.addHandler(jwyWebSocketHandler(), "/websocket.ws").addInterceptors(jwyWebSocketHandShake());} }
    处理类:
    public class MyHandler implements WebSocketHandler {private static CopyOnWriteArraySet<WebSocketSession> onLineUserList = new CopyOnWriteArraySet<WebSocketSession>();private static int onLineUserNum=0;//连接关闭执行方法@Overridepublic void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1)throws Exception {// TODO Auto-generated method stub}//连接建立@Overridepublic void afterConnectionEstablished(WebSocketSession session)throws Exception {// TODO Auto-generated method stub//JwySessionModel jsm=(JwySessionModel) arg0.getAttributes().get("user");//arg0.sendMessage(new Object());onLineUserList.add(session);this.addOnlineCount();}//消息处理@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> wsMessage)throws Exception {// TODO Auto-generated method stub}//异常处理@Overridepublic void handleTransportError(WebSocketSession arg0, Throwable arg1)throws Exception {// TODO Auto-generated method stubonLineUserList.remove(arg0);this.subOnlineCount();}@Overridepublic boolean supportsPartialMessages() {// TODO Auto-generated method stubreturn false;}public static synchronized int getOnlineCount() {        return onLineUserNum;    }     public static synchronized void addOnlineCount() {    MyHandler.onLineUserNum++;    }     public static synchronized void subOnlineCount() {
    MyHandler.onLineUserNum--;
        } }
    握手处理
    public class WebsocketHandShake extends HttpSessionHandshakeInterceptor{//握手完成@Overridepublic void afterHandshake(ServerHttpRequest request,ServerHttpResponse response, WebSocketHandler wsHandler,Exception ex) {// TODO Auto-generated method stubsuper.afterHandshake(request, response, wsHandler, ex);}//握手之前,第一次连接获取request中用户信息等信息返回false握手失败@Overridepublic boolean beforeHandshake(ServerHttpRequest arg0,ServerHttpResponse arg1, WebSocketHandler arg2,Map<String, Object> arg3) throws Exception {try {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) arg0;HttpSession session = servletRequest.getServletRequest().getSession(false); String x= (String) session.getAttribute("xxx");//loginId  arg3.put("xxxx", x);} catch (Exception e) {return false;}return true;}}
    启动后打印websocket注册
  3. 添加websocket注册路径到spring-mvc中
    <servlet>    <description>spring mvc servlet</description>    <servlet-name>springMvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <description>配置文件</description>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring-mvc.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>springMvc</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>  <servlet-mapping>    <servlet-name>springMvc</servlet-name>    <url-pattern>*.ws</url-pattern>  </servlet-mapping>
    ws://localhost:8080${applyName}/websocket.ws则可以建立通道连接。

0 0
原创粉丝点击