首页 文章 精选 留言 我的

精选列表

搜索[白金认证],共10003篇文章
优秀的个人博客,低调大师

阿里云ACE认证之理解CDN技术

学习参考资料 CDN学习笔记 CDN架构以及原理分析 深入理解CDN的概念 我们要深入理解CDN技术,首先我们得找到线头,剥丝抽茧最终理解CDN到底是一个什么样的东西,或者说是什么样的一个概念CDN是英文Content Delivery Network的缩写,中文释义是内容分布式网络,内容是什么?如何分布?并如何形成有规则有机制的网络,如何从这三个方面去试试分解的去理解。为了大家更好的理解,我们就用最熟悉的应用场景网站去进行分析。 1、网站内容,我们每天都不同的网站获取不同的数据和信息,我们根本不知道网站的内容存在哪里?我们也不关心,但我们总觉得他们就好像存在我们的身边,我们如何获取ing。。。。

优秀的个人博客,低调大师

springboot+jwt做api的token认证

本篇和大家分享jwt(json web token)的使用,她主要用来生成接口访问的token和验证,其单独结合springboot来开发api接口token验证很是方便,由于jwt的token中存储有用户的信息并且有加密,所以适用于分布式,这样直接吧信息存储在用户本地减速了服务端存储sessiion或token的压力;如下快速使用: <!--jwt--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> <!--阿里 FastJson依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.44</version> </dependency> 一般使用jwt来达到3种结果: 生成token 验证token是否有效 获取token中jwt信息(主要用户信息) 生成token 引入了jjwt依赖后,要生成token很方便;对于一个token来说,代表的是唯一并且不可逆的,因此我们在生成时需要增加一些唯一数据进去,比如下面的id: long currentTime = System.currentTimeMillis(); return Jwts.builder() .setId(UUID.randomUUID().toString()) .setIssuedAt(new Date(currentTime)) //签发时间 .setSubject("system") //说明 .setIssuer("shenniu003") //签发者信息 .setAudience("custom") //接收用户 .compressWith(CompressionCodecs.GZIP) //数据压缩方式 .signWith(SignatureAlgorithm.HS256, encryKey) //加密方式 .setExpiration(new Date(currentTime + secondTimeOut * 1000)) //过期时间戳 .addClaims(claimMaps) //cla信息 .compact(); 通过uuid来标记唯一id信息;当然在对token加密时需要用到秘钥,jwt很是方便她支持了很多中加密方式如:HS256,HS265,Md5等复杂及常用的加密方式;jwt生成的token中内容分为3个部分:head信息,payload信息,sign信息,通常我们要做的是往payload增加一些用户信息(比如:账号,昵称,权限等,但不包含密码);在对jwt的token有一定了解后,我们来看下真实生成的token值: eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAAFWMTQ7CIBSE7_LWkPDzaEsP4QnYINCIptX4INE0vbtg4sLlfPPN7HAtGWbwg1BKL4GrcbEcIwpujZF8iiEpjXFapAAG2ReYpUEcR2VxYED13Nb0ppLW3hP1eEnblqsQuiFfY0OhUrl3I70evweU_aFSejZhd7DlcDv5NTmYHUilHTD3rf_hAccHRTv--7YAAAA.i4xwoQtaWI0-dwHWN8uZ4DBm-vfli5bavYU9lRYxU5E 验证token是否有效 token生成的时都会伴随者有一个失效的时间,在这我们可以通过setExpiration函数设置过期时间,记住jwt的有效时间不是滑动的,也就是说不做任何处理时,当到达第一次设置的失效时间时,就基本没用了,要获取token是否过期可以使用如下方式: public static boolean isExpiration(String token, String encryKey) { try { return getClaimsBody(token, encryKey) .getExpiration() .before(new Date()); } catch (ExpiredJwtException ex) { return true; } } 这里使用了date的before来用获取的过期时间和当前时间对比,判断是否继续有效,需要注意的是如果在token失效后再通过getClaimsBody(token, encryKey)获取信息,此时会报ExpiredJwtException错误,我们即可认为过期。 获取token中jwt信息(主要用户信息) 通常我们要把登录用户信息存储在jwt生成的token中,这里可以通过 addClaims(claimMaps) //cla信息 传递map来设置信息,反过来要获取token中的用户信息,我们需要这样做: return Jwts.parser() .setSigningKey(encryKey) .parseClaimsJws(token) .getBody(); 此时body获取出来是Claims类型,我们需要从中获取到用户信息,需要注意的是在addClaims存储信息的时候如果存储的map值没做过出来,那完整的实体对象存储进去后会映射成一个LinkHasMap类型,如下:因此通常会在存储的时候json化,如下代码: claimMaps.forEach((key, val) -> { claimMaps.put(key, JSON.toJSONString(val)); }); 再来就是通过get方法获取我们存储进去的信息,并json反序列化: /** * 获取body某个值 * * @param token * @param encryKey * @param key * @return */ public static Object getVal(String token, String encryKey, String key) { return getJws(token, encryKey).getBody().get(key); } /** * 获取body某个值,json字符转实体 * * @param token * @param encryKey * @param key * @param tClass * @param <T> * @return */ public static <T> T getValByT(String token, String encryKey, String key, Class<T> tClass) { try { String strJson = getVal(token, encryKey, key).toString(); return JSON.parseObject(strJson, tClass); } catch (Exception ex) { return null; } } 来到这里一个Jwt的Util代码基本就完成了,下面给出完整的代码例子,仅供参考: public class JwtUtil { /** * 获取token - json化 map信息 * * @param claimMaps * @param encryKey * @param secondTimeOut * @return */ public static String getTokenByJson(Map<String, Object> claimMaps, String encryKey, int secondTimeOut) { return getToken(claimMaps, true, encryKey, secondTimeOut); } /** * 获取token * * @param claimMaps * @param isJsonMpas * @param encryKey * @param secondTimeOut * @return */ public static String getToken(Map<String, Object> claimMaps, boolean isJsonMpas, String encryKey, int secondTimeOut) { if (isJsonMpas) { claimMaps.forEach((key, val) -> { claimMaps.put(key, JSON.toJSONString(val)); }); } long currentTime = System.currentTimeMillis(); return Jwts.builder() .setId(UUID.randomUUID().toString()) .setIssuedAt(new Date(currentTime)) //签发时间 .setSubject("system") //说明 .setIssuer("shenniu003") //签发者信息 .setAudience("custom") //接收用户 .compressWith(CompressionCodecs.GZIP) //数据压缩方式 .signWith(SignatureAlgorithm.HS256, encryKey) //加密方式 .setExpiration(new Date(currentTime + secondTimeOut * 1000)) //过期时间戳 .addClaims(claimMaps) //cla信息 .compact(); } /** * 获取token中的claims信息 * * @param token * @param encryKey * @return */ private static Jws<Claims> getJws(String token, String encryKey) { return Jwts.parser() .setSigningKey(encryKey) .parseClaimsJws(token); } public static String getSignature(String token, String encryKey) { try { return getJws(token, encryKey).getSignature(); } catch (Exception ex) { return ""; } } /** * 获取token中head信息 * * @param token * @param encryKey * @return */ public static JwsHeader getHeader(String token, String encryKey) { try { return getJws(token, encryKey).getHeader(); } catch (Exception ex) { return null; } } /** * 获取payload body信息 * * @param token * @param encryKey * @return */ public static Claims getClaimsBody(String token, String encryKey) { return getJws(token, encryKey).getBody(); } /** * 获取body某个值 * * @param token * @param encryKey * @param key * @return */ public static Object getVal(String token, String encryKey, String key) { return getJws(token, encryKey).getBody().get(key); } /** * 获取body某个值,json字符转实体 * * @param token * @param encryKey * @param key * @param tClass * @param <T> * @return */ public static <T> T getValByT(String token, String encryKey, String key, Class<T> tClass) { try { String strJson = getVal(token, encryKey, key).toString(); return JSON.parseObject(strJson, tClass); } catch (Exception ex) { return null; } } /** * 是否过期 * * @param token * @param encryKey * @return */ public static boolean isExpiration(String token, String encryKey) { try { return getClaimsBody(token, encryKey) .getExpiration() .before(new Date()); } catch (ExpiredJwtException ex) { return true; } } public static String getSubject(String token, String encryKey) { try { return getClaimsBody(token, encryKey).getSubject(); } catch (Exception ex) { return ""; } } } 过滤器验证token 有了基本的JwtUtil工具,我们需要用到springboot项目中,一般来说对于登录授权token验证可以通过过滤器来操作,这里创建一个AuthenFilter,用于对post请求过来的token做验证: public class AuthenFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest rq = (HttpServletRequest) servletRequest; HttpServletResponse rp = (HttpServletResponse) servletResponse; RpBase rpBase = new RpBase(); try { //只接受post if (!rq.getMethod().equalsIgnoreCase("post")) { filterChain.doFilter(servletRequest, servletResponse); return; } String token = rq.getHeader("token"); if (StringUtils.isEmpty(token)) { rpBase.setMsg("无token"); return; } //jwt验证 MoUser moUser = JwtUtil.getValByT(token, WebConfig.Token_EncryKey, WebConfig.Login_User, MoUser.class); if (moUser == null) { rpBase.setMsg("token已失效"); return; } System.out.println("token用户:" + moUser.getNickName()); filterChain.doFilter(servletRequest, servletResponse); } catch (Exception ex) { } finally { if (!StringUtils.isEmpty(rpBase.getMsg())) { rp.setCharacterEncoding("utf-8"); rpBase.setCode(HttpStatus.BAD_REQUEST.value()); rp.getWriter().write(JSON.toJSONString(rpBase)); } } } } 要是自定义过滤器AuthenFilter生效,还需要把她注册到容器中,这里通过编码方式,当然还可以通过@WebFilter注解来加入到容器中: @Configuration public class WebFilterConfig { @Bean public FilterRegistrationBean setFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new AuthenFilter()); registrationBean.addUrlPatterns("/api/*"); registrationBean.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); return registrationBean; } } 注意addUrlPatterns匹配的是过滤器作用的url连接,根据需求而定;为了验证效果,这里我创建了两个接口getToken和t0,分别是获取token和post查询接口,代码如是: @RestController public class TestController { @PostMapping("/api/t0") public String t0() throws MyException { return UUID.randomUUID().toString(); } @GetMapping("/token/{userName}") public String getToken(@PathVariable String userName) { MoUser moUser = new MoUser(); moUser.setUserName(userName); moUser.setNickName(userName); Map<String, Object> map = new HashMap<>(); map.put(WebConfig.Login_User, moUser); return JwtUtil.getTokenByJson(map, WebConfig.Token_EncryKey, WebConfig.Token_SecondTimeOut); } } 最终要获通过head传递token值来访问t01接口,得到如下结果:token在有效时间后访问直接失败,从新获取token并访问t01接口,得到成功的信息:

优秀的个人博客,低调大师

爱立信推出认证NFV基础设施平台

根据国外媒体报道,爱立信日前宣布推出了经验证的网络功能虚拟化基础设施(NFVi)平台,具有多厂商功能和转换服务。 爱立信的NFVi平台产品基于一个定义良好的架构,由包括爱立信的Hyperscale数据中心系统8000和刀片服务器平台、爱立信云执行环境、爱立信Cloud SDN以及咨询、系统集成和支持服务等硬件构成的完全预集成和验证的平台。 爱立信这一产品组合旨在通过虚拟网络功能(VNFs)部署提供更多灵活性。 加上可提供的服务,该平台支持各种不同的部署场景,从不同供应商的NFV组件完全解耦到完整的堆栈平台。 爱立信指出,作为构建5G和物联网(IoT)基础设施的第一步,NFVi支持软件定义的基础设施,在部署新服务时提供更高的速度、灵活性和效率。 爱立信已经与全球众多一级运营商(包括Telstra、Swisscom、Telefonica、Axiata、Digicel和软银)签署了各种NFV合同,并且是首个提供NFV实地商业部署的供应商。 本文转自d1net(转载)

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册