热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

socket转http简单的认证功能

很久没有更新博客,因为不知道有什么可以写的。虽然近期学了也用到了kafka,redis这些技术。但是终究停留在会用的层次。这次做了把原有业务socket协议转为htt

     很久没有更新博客,因为不知道有什么可以写的。虽然近期学了也用到了kafka,redis这些技术。但是终究停留在会用的层次 。这次做了把原有业务socket协议转为http的需求 。记录一下。

    现有业务时拣货员,配送员使用小程序来拣货,配送。完成订单状态变更。但是可能由于网络问题,老是掉线。影响工作效率。原来使用了netty的socketid框架。大家都不太熟悉。后来老大建议转http方式来做。提升稳定性。

   原来的做法。socket-io自带了心跳保活。一定时间内,服务端没有收到客户端的心跳,会主动断开与客户端的链接。每当有新订单/订单被撤回的时候,服务器会主动通知客户端消息变更。

 

 

现在更改为前台轮询心跳接口,刷新tokenshi时间,并获取此客户端有无订单变化。若有,则重新查询,若无,则等待下一次心跳。心跳接口如下

public JSONObject heartBeat(HttpServletRequest httpServletRequest){JSONObject json=new JSONObject();//根据token获得userIdString token=httpServletRequest.getHeader("token");Integer userId=getUserIdByToken(token);logger.info("心跳"+userId);if(userId==null){json.put("status",Constants.heartBeat.noUser);return json;}//刷新redis缓存时间
redisTemplate.opsForValue().set(CommonUtil.MD5(String.valueOf(userId)),userId.toString(),60, TimeUnit.SECONDS);Object status=redisTemplate.opsForValue().get(String.valueOf(userId));redisTemplate.opsForValue().set(userId.toString(),Constants.heartBeat.begin);json.put("status",status);return json;}

登录接口逻辑:登录校验,成功后,则生成token ,存token(key)和userId(value). 用户所有请求在请求头中附带token.服务器获得token后再redis查询userId获取用户信息。

redis用的比较少。碰到下面这些坑。记录一下

 

序列化配置:

&#64;Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate template &#61; new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);GenericToStringSerializer genericToStringSerializer &#61; new GenericToStringSerializer(Object.class);template.setValueSerializer(genericToStringSerializer);template.setKeySerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}

redis监听失效key


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;&#64;Configuration
public class RedisConfiguration {&#64;Autowiredprivate RedisConnectionFactory redisConnectionFactory;&#64;Beanpublic RedisMessageListenerContainer redisMessageListenerContainer() {RedisMessageListenerContainer redisMessageListenerContainer &#61; new RedisMessageListenerContainer();redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);return redisMessageListenerContainer;}&#64;Beanpublic KeyExpirationEventListener keyExpiredListener() {return new KeyExpirationEventListener(this.redisMessageListenerContainer());}}

import com.qiancang.transport.client.UserClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;public class KeyExpirationEventListener extends KeyExpirationEventMessageListener {&#64;AutowiredRedisTemplate redisTemplate;&#64;AutowiredUserClient userClient;private Logger logger&#61; LoggerFactory.getLogger(KeyExpirationEventListener.class);public KeyExpirationEventListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}//监听key失效方法 在这里将失效用户踢下线&#64;Overridepublic void onMessage(Message message, byte[] pattern) {String key &#61; new String(message.getBody());//}
}

 说实话 感觉这个需求意义不大。但是上面要做就做吧。也算是能学到东西。做完以后稳定性提升了。服务器不需要维护长连接&#xff0c;效率更高。但是有了频繁的心跳请求。已经尽量减少心跳的操作了。但是频繁的心跳还是会消耗不少的服务器资源。性能测试对比&#xff0c;http方式有一定的性能提升。但我感觉测试的结果可能有一些偏差。因为我不觉得自己写的心跳机制比netty好。后续跟着看一下性能把


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
jhb852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有