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

购物网站前台功能模块活动设计方案模板

购物网站前台功能模块,活动设计方案模板,wordpress有点,制作网站协议书短信登录 基于Session实现登录 流程#xff1a; 发送短信验证码--短信验证码注册登录--校验登录状态#xff08;保存用户到ThreadLocal#xff0c;方便后续使用#xff09; 不能每次请求服务都要进行登录状态校验#xff0c;解决办法#xff1a;拦截器 在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是 服务经过计算发给客户端的服务不保存每次客户端来请求经过解密等计算来验证是否是自己下发的. JWTJWT不仅仅是一个生成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, ClassR type, FunctionID,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, ClassR type, FunctionID, 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://www.hkea.cn/news/14559675/

相关文章:

  • 个人网站建设目的手机查询wordpress分类id
  • 单页网站开发wordpress怎么修改后台登录地址
  • 网站制作好如何上线数据中台建设方案
  • 个人简介网站怎么做百度销售平台怎样联系
  • 可以免费做网站推广的平台wordpress创建目录失败
  • 南京江宁 网站建设导出wordpress所有链接
  • 网站网络营销推广制作高端网站设计定制公司
  • 个人网站名称江苏省建设主管部门网站
  • 兰州专业网站建设团队石家庄网站制作哪家好
  • 广州网站建设交易正规的企业网站建设
  • 南通优普营销网站建设西安学校网站建设哪家好
  • 上海网站推广策划电商网站开发prd
  • 建立网站建设专门做字体设计的网站
  • 深圳展览设计网站建设展厅设计公司西安
  • 教育网站如何做经营国家反诈中心app下载安装
  • 昆山品牌网站wplounge wordpress主题
  • 在线做免费网站做网站需要icp吗
  • 官网和网站的区别网站制作 文案
  • 亚马逊网站推广怎么做山东天齐建设集团网站
  • 免费网站的软件下载响应式网页源码
  • 织梦cms做电影网站国外优秀企业网站欣赏
  • 备案网站地址内网网站建设流程
  • php做的网站模板下载地址上海企业注销简易流程
  • 网站怎么增加代码设计上海2021门票
  • 网站开发kpi网站开发公司选择
  • 医院网站如何备案怎么申请自己公司的邮箱
  • 企业网站建设研究论文北京好的做网站的公司有哪些
  • 咸阳微网站建设服务器怎么做网站
  • 网站职业技能培训班想把公司的外部网站替换
  • 如何拷贝网站代码linux下做网站