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

国外 视频上传网站源码孩子学编程的利弊

国外 视频上传网站源码,孩子学编程的利弊,群晖wordpress二级目录,微信网站是什么文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法#xff1a;Token#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程#xff… 文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程为gateway增加登录校验拦截器 另一种单点登录方法TokenRedis实现单点登录 JWT实现单点登录 登录流程 校验用户名密码-生成随机JWT Token-返回给前端。之后前端发请求携带该Token就能验证是哪个用户了。校验流程 从前端请求的header获取JWT Token-根据工具包校验JWT Token-校验成功或失败 JWT 简介 结构 Header 头部信息主要声明了JWT的签名算法等信息 Payload 载荷信息主要承载了各种声明并传递明文数据 Signature 签名拥有该部分的JWT被称为JWS也就是签了名的JWT用于校验数据 整体结构是 header.payload.signature 参考文档https://doc.hutool.cn/pages/jwt/ 存在问题及解决方案 token被解密如工具包被获取。可通过增加“盐值”来解决。 token被拿到第三方使用如被包装到第三方使用ChatGPT工具可以通过限流来解决。 登录流程 后端程序实现 封装hutool工具类 public class JwtUtil {private static final Logger LOG LoggerFactory.getLogger(JwtUtil.class);/*** 盐值很重要不能泄漏且每个项目都应该不一样可以放到配置文件中*/private static final String key xxx;public static String createToken(Long id, String mobile) {LOG.info(开始生成JWT tokenid{}mobile{}, id, mobile);GlobalBouncyCastleProvider.setUseBouncyCastle(false);DateTime now DateTime.now();DateTime expTime now.offsetNew(DateField.HOUR, 24); // DateTime expTime now.offsetNew(DateField.SECOND, 10);MapString, Object payload new HashMap();// 签发时间payload.put(JWTPayload.ISSUED_AT, now);// 过期时间payload.put(JWTPayload.EXPIRES_AT, expTime);// 生效时间payload.put(JWTPayload.NOT_BEFORE, now);// 内容payload.put(id, id);payload.put(mobile, mobile);String token JWTUtil.createToken(payload, key.getBytes());LOG.info(生成JWT token{}, token);return token;}public static boolean validate(String token) {LOG.info(开始JWT token校验token{}, token);GlobalBouncyCastleProvider.setUseBouncyCastle(false);JWT jwt JWTUtil.parseToken(token).setKey(key.getBytes());// validate包含了verifyboolean validate jwt.validate(0);LOG.info(JWT token校验结果{}, validate);return validate;}public static JSONObject getJSONObject(String token) {GlobalBouncyCastleProvider.setUseBouncyCastle(false);JWT jwt JWTUtil.parseToken(token).setKey(key.getBytes());JSONObject payloads jwt.getPayloads();payloads.remove(JWTPayload.ISSUED_AT);payloads.remove(JWTPayload.EXPIRES_AT);payloads.remove(JWTPayload.NOT_BEFORE);LOG.info(根据token获取原始内容{}, payloads);return payloads;}public static void main(String[] args) {createToken(1L, 123);String token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE3MzY0ODczMDQsIm1vYmlsZSI6IjEyMyIsImlkIjoxLCJleHAiOjE3MzY1NzM3MDQsImlhdCI6MTczNjQ4NzMwNH0.Bui7guCvPEF557eqxRLwmt5tO-W-3oVLnn37H4qOVfA;validate(token);getJSONObject(token);} }后端定义登录业务 public MemberLoginResp login(MemberLoginReq memberLoginReq){String mobile memberLoginReq.getMobile();String code memberLoginReq.getCode();Member memberDB selectByMobile(mobile);if (ObjectUtil.isEmpty(memberDB)){throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_NOT_EXIST);}if(!code.equals(8888)){throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_CODE_ERROR);}MemberLoginResp memberLoginResp new MemberLoginResp();memberLoginResp.setId(memberDB.getId());memberLoginResp.setMobile(mobile);String token JwtUtil.createToken(memberDB.getId(), memberDB.getMobile());memberLoginResp.setToken(token);return memberLoginResp;}通过调用封装的JwtUtil生成token并返回前端 成功返回Token结果 前端保存Token Vuex全局保存Token到store中 import { createStore } from vuexconst MEMBER MEMBER;export default createStore({state: {member: {}},getters: {},mutations: {setMember (state, _member) {state.member _member;}},actions: {},modules: {} }) const login () {axios.post(/member/member/login, loginForm).then((response) {let data response.data;if (data.success) {notification.success({ description: 登录成功 });// 登录成功跳到控台主页router.push(/welcome);store.commit(setMember, data.content);} else {notification.error({ description: data.message });}})};store存放信息的缺点及解决 store存放用户信息后如果刷新页面那么信息也会消失 store可以理解为缓存一旦重新加载则缓存全都没了。 解决方法 step1. 新增session-storage.js封装会话缓存sessionStorage // 所有的session key都在这里统一定义可以避免多个功能使用同一个key SESSION_ORDER SESSION_ORDER; SESSION_TICKET_PARAMS SESSION_TICKET_PARAMS;SessionStorage {get: function (key) {var v sessionStorage.getItem(key);if (v typeof(v) ! undefined v ! undefined) {return JSON.parse(v);}},set: function (key, data) {sessionStorage.setItem(key, JSON.stringify(data));},remove: function (key) {sessionStorage.removeItem(key);},clearAll: function () {sessionStorage.clear();} }; step2. 在index.html中引入该js !DOCTYPE html html langheadmeta charsetutf-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width,initial-scale1.0link relicon href% BASE_URL %favicon.ico!-- 引入js --script src% BASE_URL %js/session-storage.js/scripttitle% htmlWebpackPlugin.options.title %/title/headbodynoscriptstrongWere sorry but % htmlWebpackPlugin.options.title % doesnt work properly without JavaScript enabled. Please enable it to continue./strong/noscriptdiv idapp/div!-- built files will be auto injected --/body /htmlstep3. 修改store的index.js const MEMBER MEMBER;export default createStore({state: {member: window.SessionStorage.get(MEMBER) || {} # 读取},getters: {},mutations: {setMember (state, _member) {state.member _member;window.SessionStorage.set(MEMBER, _member); # 设置}},不再是把member定义为{}而是首先在缓存中获取如果没有则设置为{}。同时避免空指针 同时在用户登录后设置MEMBER缓存 校验流程为gateway增加登录校验拦截器 添加依赖 dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.10/version/dependency拦截器类 Component public class LoginMemberFilter implements Ordered, GlobalFilter {private static final Logger LOG LoggerFactory.getLogger(LoginMemberFilter.class);Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {String path exchange.getRequest().getURI().getPath();// 排除不需要拦截的请求if (path.contains(/admin)|| path.contains(/redis)|| path.contains(/test)|| path.contains(/member/member/login)|| path.contains(/member/member/send-code)) {LOG.info(不需要登录验证{}, path);return chain.filter(exchange);} else {LOG.info(需要登录验证{}, path);}// 获取header的token参数String token exchange.getRequest().getHeaders().getFirst(token);LOG.info(会员登录验证开始token{}, token);if (token null || token.isEmpty()) {LOG.info( token为空请求被拦截 );exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 校验token是否有效包括token是否被改过是否过期boolean validate JwtUtil.validate(token);if (validate) {LOG.info(token有效放行该请求);return chain.filter(exchange);} else {LOG.warn( token无效请求被拦截 );exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}}/*** 优先级设置 值越小 优先级越高** return*/Overridepublic int getOrder() {return 0;} }测试结果 直接调用不需要验证登录的接口 RestController public class TestController {GetMapping(/test)public String test(){return test;}}调用需要登录的接口方法未登录 同时服务器端没有打印表示请求已被拦截 调用login登陆后再次执行上述请求 login打印日志 调用请求打印日志 可见成功校验token并读取登录用户信息通过校验 另一种单点登录方法TokenRedis实现单点登录 登录流程 校验用户名密码-生成随机Token-将Token存放到Redis并返回给前端。 之后前端发请求携带该Token就能验证是哪个用户了。校验流程 从前端请求的header获取Token-根据Token到Redis获取用户数据-若有数据则登录校验通过否则失败
http://www.yayakq.cn/news/1745/

相关文章:

  • dedecms做网站教程wordpress 页脚信息
  • 怎么查看一个网站开发语言家具网站案例
  • 网站提升流量wordpress文章网格
  • 东南亚cod建站工具广州网站设计公司推荐哪家
  • 打鱼跟电子游戏网站怎么做栖霞做网站价格
  • 如何做网站本地服务器吗制作h5的软件有什么
  • 自己做网站要学什么软件下载郑州%公司 网站建设
  • 大兴模版网站搭建哪家好阿里云成功备案的网站增加域名
  • 宁波建网站可按需定制叙永县城乡建设部网站首页
  • 天津网站建设方案书网站用户权限
  • 北京网站建设公司拟莱芜网球培训
  • 月子会所网站源码深圳网站设计有哪些
  • 免费制作论坛网站模板wordpress 找不到网页
  • 设计购物网站南宁码科网站建设
  • 宁波网站建设制作电话号码手机网站建站
  • 响应式设计网站手机百度免费下载
  • 有哪些网站做任务有佣金株洲网
  • 好网站范例淘宝客app定制
  • php禁止ip访问网站建站之星怎么安装
  • 做一个网站多少费用成都市网站建设服务商
  • qq空间做单页网站做响应式网站哪家好
  • asp企业网站模板营销型网站建设成为企业发展新趋势
  • 在线手机网站建设阿里云域名注册新人
  • 长清治做网站福州搜索优化公司
  • 常用网站开发工具有哪些wordpress+修改邮箱
  • 用户体验网站外贸公司的网站建设
  • 做网站需要跟客户了解什么软件asp.net 网站的头部和底部怎么来做 include
  • 重庆在线开放平台哈尔滨网络优化公司有哪些
  • 小视频网站源码厦门网络建站公司
  • 绿化公司和苗圃做网站自定义导航网站 源码