当前位置: 首页 > news >正文

北京市网站公安备案查询系统小程序开发一个多少钱啊

北京市网站公安备案查询系统,小程序开发一个多少钱啊,苹果园网站建设,长沙市公司网站设计短信登录 基于Session实现登录 流程: 发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用) 不能每次请求服务都要进行登录状态校验,解决办法:拦截器 在Sp…

短信登录

基于Session实现登录

流程:

发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用)

不能每次请求服务都要进行登录状态校验,解决办法:拦截器

在Spring框架中,拦截器(Interceptor)可以通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类来实现。拦截器通常用于在请求到达控制器之前进行预处理,例如身份验证、权限检查等。

1.创建拦截器(拦截器需要实现HandlerInterceptor接口,并重写方法)

2.注册拦截器(通过WebMvcConfigurer接口来注册拦截器。)

3.配置拦截器的排除路径(在实际应用中,某些接口(如登录、注册接口)不需要进行身份验证)

区分一下session,cookie和token

CookieCookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来,服务不保存。每次请求时客户端带上cookie。服务器检查该Cookie,以此来辨认用户状态。

Session: 服务器在处理客户端请求过程中会创建session,并且为该session生存唯一的session ID。

服务器将session ID发送到客户端.当客户端再次请求时,就会带上这个session ID.服务器接收到请求之后就会一句Session ID 找到相应的Session ,完成请求.session是服务本地保存,发给客户端,客户端每次访问都带着,直接和服务的session比对

Token:Token是服务端生成的一串字符串,当作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码.token是 服务经过计算发给客户端的,服务不保存,每次客户端来请求,经过解密等计算来验证是否是自己下发的.

JWT:JWT不仅仅是一个生成Token的过程,它还提供了一种结构化、自包含、无状态的Token设计。验证Token时,服务器不需要查询数据库,直接解析和验证签名即可。

机制

存储位置

通信方式

生命周期

Cookie

浏览器

自动Header携带

可设置过期时间

️ Session

服务端

SessionID传递

服务端控制

Token

客户端

手动Header添加

令牌有效期决定

️ JWT

客户端

Bearer Token

包含过期时间声明

集群Session共享问题

session的痛点(负载均衡导致的)

多态Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题

基于Redis实现共享session登录

发送验证码逻辑实现:

1.校验手机号

2.不符合返回错误信息

3.符合生成验证码

4.保存验证码到redis

5.发送验证码

登录验证逻辑:

1.校验手机号

2.不符合返回错误信息

3.从redis中获取验证码并校验

4.不一致报错,一致,根据手机号查询用户

5.判断用户是否存在

6.保存用户信息到redis

6.1随机生成token,作为登录令牌

6.2将User对象转为Hash存储

6.3存储

7.返回token

登录拦截器的优化

拦截器:

1.获取token

2.查询Redis的用户

3.保存到ThreadLocal

4.刷新token有效器

5.放行

问题:

如果用户登录以后一直请求的是不需要拦截的请求,那么token有效期没有刷新,即使用户一直在使用,也没有做到token更新

解决办法:双拦截器

第一个拦截器拦截所有请求-->第二个拦截器拦截需要登录的请求

商户查询缓存

什么是缓存

缓存:数据交换的缓冲区,是存储数据的临时地方,一般读写性能毕竟高

浏览器(浏览器缓存)--->Redis(应用层缓存)--->数据库(数据库缓存)

缓存的作用:

1.降低后端负载 2.提高读写效率,降低相应时间

缓存的成本

1.数据一致性成本 2.代码维护成本 3.运维成本

添加Redis缓存

客户端请求优先到达缓存,如果缓存命中直接返回数据,如果未命中,请求数据库,并且写入缓存

缓存更新:

内存淘汰:不用自己维护,内存不足时自动淘汰部分数据

超时剔除:给缓存数据添加TTL时间,到期后自动删除缓存

主动更新:当涉及到数据库的增删改时,主动更新Redis缓存

主动更新策略:

1.在更新数据库的同时更新缓存------常用

2.数据库和缓存整合为一个服务,由服务来维护一致性

3.调用者只操作缓存,由其它线程异步的缓存数据持久到数据库,保证最终一致

操作缓存和数据库时有三个问题需要考虑:

1.删除缓存还是更新缓存?
2.如何保证缓存与数据库的操作同时成功或失败?

3.先操作缓存还是先操作数据库?

都有可能出现线程不安全的问题。 方案二的不安全几率更低---常用

缓存穿透

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

常见的解决方案:

缓存空对象:缓存null

优点:实现简单,维护方便

缺点:额外的内存消耗,可能造成短期的不一致

布隆过滤:

客户端-->布隆过滤器-->Redis

布隆过滤器:利用hash存储数据库里的字段

优点:内存占用少,没有多余key

缺点:实现复杂,可能存在误判可能

缓存雪崩

在同一时段内大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大的压力

解决方案:

给不同的key的TTL添加随机值

利用Redis集群提高服务的可用性

给缓存业务添加降级限流策略

给业务添加多级缓存

缓存击穿

也叫热点Key问题,就是一个高并发访问并且缓存重建业务较复杂的key突然失效了,无效的请求访问会在瞬间给数据库带来巨大的冲击

常见的解决方案:

互斥锁

逻辑过期

缓存工具封装

方法1:将任意java对象序列化为json并存储在String类型的key中,并且可以设置TTL过期时间

方法2:将任意java对象序列化为json并存储在String类型的key中,并且可以设置逻辑过期时间,用于处理缓存击穿问题

方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空值的方式解决缓存穿透问题

方法4:根据指定的key查询缓存,并反序列化为指定类型,利用逻辑过期的方式解决缓存击穿问题

Public class CacheClient{private StringRedisTemplate stringRedisTemplate;public void set(String key, Object object,Long time,TimeUnit unit){StringRedisTemplate.opsForValue().set(key,JSONUTIL.toJsonStr(value),time,unit)}public void setWithLogicalExpire(String key, Object object,Long time,TimeUnit unit){//设置逻辑过期RedisData redisData = new RedisData();redisData.setData(value);redisData.setExpireTime(LocalDateTime.now().plusSeconds(unit.toSeconds(time)));StringRedisTemplate.opsForValue().set(key,JSONUTIL.toJsonStr(redisData))}public <R, ID> R queryWithPassThrough(Long time,TimeUnit unit,String keyPrefix, ID id, Class<R> type, Function<ID,R> dbFallback){String key = keyPrefix + id;//1.从Redis中查询商铺缓存String json = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if(StrUtil.isNotBlank(json)){return JSONUtil.toBean(json,type);}//3.判断命中的是否是空值is(json != null){return null;}//4.从数据库进行查询R r = dbFallback.apply(id);//5.不存在,返回错误if(r == null){//将空值写入redisstringRedisRemplate.opsForValue().set(key,"",null,TimeUnit.MINUTES);return null;}//6.存在,写入redisthis.set(key,r,time,unit);}public <R, ID> R queryWithLogicalExpire(String keyPrefix, ID id, Class<R> type, Function<ID, R> dbFallback, Long time, TimeUnit unit) {String key = keyPrefix + id;// 1.从Redis中查询缓存String json = stringRedisTemplate.opsForValue().get(key);// 2.判断是否存在if (StrUtil.isNotBlank(json)) {// 3.反序列化为RedisData对象RedisData redisData = JSONUtil.toBean(json, RedisData.class);R r = redisData.getData();LocalDateTime expireTime = redisData.getExpireTime();// 4.判断是否逻辑过期if (expireTime.isAfter(LocalDateTime.now())) {// 5.未过期,直接返回缓存数据return r;} else {// 6.已过期,更新缓存// 6.1 从数据库查询最新数据R latestData = dbFallback.apply(id);// 6.2 如果数据库中没有数据,返回nullif (latestData == null) {return null;}// 6.3 更新缓存RedisData newRedisData = new RedisData<>();newRedisData.setData(latestData);newRedisData.setExpireTime(LocalDateTime.now().plusSeconds(unit.toSeconds(time)));stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(newRedisData));// 6.4 返回最新数据return latestData;}} else {// 7.缓存中没有数据,从数据库查询R r = dbFallback.apply(id);// 8.如果数据库中没有数据,返回nullif (r == null) {return null;}// 9.将数据写入缓存RedisData redisData = new RedisData<>();redisData.setData(r);redisData.setExpireTime(LocalDateTime.now().plusSeconds(unit.toSeconds(time)));stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(redisData));// 10.返回查询结果return r;} }  
}

优惠劵秒杀

达人探店

好友关注

附近的商户

用户签到

UV统计


文章转载自:
http://dinncowhosit.wbqt.cn
http://dinncofrequence.wbqt.cn
http://dinncoimmortalization.wbqt.cn
http://dinncoeurythmy.wbqt.cn
http://dinncoeternize.wbqt.cn
http://dinncosympathin.wbqt.cn
http://dinncotonetics.wbqt.cn
http://dinncochayote.wbqt.cn
http://dinncoreach.wbqt.cn
http://dinncohalakah.wbqt.cn
http://dinncotranslatability.wbqt.cn
http://dinncodependent.wbqt.cn
http://dinncostrife.wbqt.cn
http://dinncochauncey.wbqt.cn
http://dinncoinhalatorium.wbqt.cn
http://dinnconephrectomy.wbqt.cn
http://dinnconapery.wbqt.cn
http://dinncointuitive.wbqt.cn
http://dinncodree.wbqt.cn
http://dinncopoaceous.wbqt.cn
http://dinncopeteman.wbqt.cn
http://dinncolgm.wbqt.cn
http://dinncotransilvania.wbqt.cn
http://dinncometasomatic.wbqt.cn
http://dinncofa.wbqt.cn
http://dinncocrustal.wbqt.cn
http://dinncodebilitate.wbqt.cn
http://dinncopulverizer.wbqt.cn
http://dinncobifoliolate.wbqt.cn
http://dinncowider.wbqt.cn
http://dinncoflagstick.wbqt.cn
http://dinncotyrosine.wbqt.cn
http://dinncoholistic.wbqt.cn
http://dinncomarker.wbqt.cn
http://dinncodipode.wbqt.cn
http://dinncoscissor.wbqt.cn
http://dinncobacilliform.wbqt.cn
http://dinncocarsey.wbqt.cn
http://dinncoliquescence.wbqt.cn
http://dinncomusician.wbqt.cn
http://dinncoceremonialize.wbqt.cn
http://dinncoreplaceable.wbqt.cn
http://dinncowitching.wbqt.cn
http://dinncobachelor.wbqt.cn
http://dinncokeyphone.wbqt.cn
http://dinncogoofy.wbqt.cn
http://dinncorhizopodan.wbqt.cn
http://dinncopronoun.wbqt.cn
http://dinncofleury.wbqt.cn
http://dinncointernationally.wbqt.cn
http://dinncolactometer.wbqt.cn
http://dinncoonymous.wbqt.cn
http://dinncobleaching.wbqt.cn
http://dinncopliancy.wbqt.cn
http://dinncofruitfully.wbqt.cn
http://dinncoinadvertence.wbqt.cn
http://dinncoelectrothermal.wbqt.cn
http://dinnconeurogenic.wbqt.cn
http://dinncolaystall.wbqt.cn
http://dinncocaldron.wbqt.cn
http://dinncolatifundista.wbqt.cn
http://dinncodebonair.wbqt.cn
http://dinncoexorcist.wbqt.cn
http://dinncodiaster.wbqt.cn
http://dinncoperfective.wbqt.cn
http://dinncofalstaffian.wbqt.cn
http://dinncotranq.wbqt.cn
http://dinncofeasance.wbqt.cn
http://dinncopicasso.wbqt.cn
http://dinncoisotopes.wbqt.cn
http://dinncocliquy.wbqt.cn
http://dinncorevolutionary.wbqt.cn
http://dinncoautochrome.wbqt.cn
http://dinncocalendula.wbqt.cn
http://dinncofridge.wbqt.cn
http://dinncotrehala.wbqt.cn
http://dinncoegeria.wbqt.cn
http://dinncospeedily.wbqt.cn
http://dinncoostrejculture.wbqt.cn
http://dinncofense.wbqt.cn
http://dinncowashboard.wbqt.cn
http://dinncocustomise.wbqt.cn
http://dinncorepled.wbqt.cn
http://dinncosondage.wbqt.cn
http://dinncostowage.wbqt.cn
http://dinncogrilled.wbqt.cn
http://dinncothalamotomy.wbqt.cn
http://dinncohepatopathy.wbqt.cn
http://dinncopossibilism.wbqt.cn
http://dinncoplainsong.wbqt.cn
http://dinncodisperse.wbqt.cn
http://dinncoscrubdown.wbqt.cn
http://dinncosleeveboard.wbqt.cn
http://dinncostabbed.wbqt.cn
http://dinncohottentot.wbqt.cn
http://dinncoplane.wbqt.cn
http://dinncosegregation.wbqt.cn
http://dinncosexavalent.wbqt.cn
http://dinncoyours.wbqt.cn
http://dinncopolycentrism.wbqt.cn
http://www.dinnco.com/news/99475.html

相关文章:

  • 批量优化网站软件国内十大4a广告公司
  • 庐江网站广告怎么做高质量外链平台
  • 做网站违法吗seo优化培训公司
  • 大型建站公司是干嘛的web网址
  • 做网站要学点什么百度搜索引擎的网址是多少
  • 花店网站开发设计的项目结构网络推广赚钱项目
  • wordpress区分移动站制作公司网站
  • 专门做网站关键词排名郑州seo网络营销
  • 做网站客源网站制作基本流程
  • 个人网站建设教学视频合肥网站建设
  • 厦门做网站seo的网站优化排名软件哪些最好
  • 外贸网站建设 惠州云南seo网络优化师
  • 网站列表页框架布局原则谷歌seo外包
  • 加工企业网站这么做怎么把自己的产品推广出去
  • 商务科技网站建设seo推广学院
  • 北京网站建设最便宜的公司女生seo专员很难吗为什么
  • 呼和浩特建设局网站外链收录网站
  • 亚洲做爰直播网站在线识别图片百度识图
  • 企业网站设计推广方案市场推广策略 包括哪些
  • 网站示例青岛网站优化
  • 电梯企业网站制作最新重大新闻
  • ip做网站域名搜收录批量查询
  • html5培训网站模板自己建网站详细流程
  • 怎么优化自己网站长沙官网seo技巧
  • 家装网站自己做的app如何推广
  • 比价网站怎么做的seo研究
  • 保定干洗机做网站销售管理怎么带团队
  • 行业网站建设内容网络推广公司服务内容
  • 小型网站开发要多少钱seo关键词排名怎么提升
  • 专业的企业网站定制公司域名查询网站信息