自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 【项目实训】微信公众号模板消息推送

首先,需要先获得一个模板如果不是测试号,那么需要申请,如果是测试号,那么简单地发请求即可获取模板。为了简化开发,我们引入一个第三方的微信开发的工具包代码

2022-06-11 21:18:42 317 1

原创 【项目实训】微信公众号获取用户openid

首先,为了方便公众号开发测试,可以申请测试号,地址如下微信公众平台向指定用户推送消息,通常需要他的openId,要获取用户的openId,可以通过微信公众号的网页授权回调(搭配一个用户绑定页面,可以将微信公众号用户与我们自己的系统的用户建立联系)上面是微信开发文档的说明,可以看到如果我们仅仅想做用户绑定,然后推送模板消息的话,那么scope只需要为snsapi_base...

2022-06-11 21:03:57 811 1

原创 【项目实训】Spring Security授权

授权是web应用常见的需求,我们需要针对不同的用户,根据他们不同的权限,放行相应的接口。在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。因此,在应用spring security的项目中,我们需要将权限信息存入Authentication。sp

2022-06-11 20:40:11 387

原创 【项目实训】SpringSecurity认证

Spring Security是Spring体系下的一个安全框架核心功能是认证和授权认证创建类实现UserDetailsService接口,重写其中的方法。方法返回的类型为UserDetails,故我们自己创建一个类来实现UserDetails接口此外,spring security提供了多种加密方式(PasswordEncoder),只需在配置类(spring security要求要extends WebSecurityConfigurerAdapter)将PasswordEncoder注

2022-06-11 20:21:31 124

原创 【项目实训】jwt

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.上述是jwt的官网的介绍,简单来说,使用jwt,可以安全地传输信息,jwt可以被验证。在我们的系统里,jwt主要用于授权。JWT由三部分组成,分别是标头、有效负载、签名算法,中间使用点进行分隔。谈起jwt,我们经常会跟传统的session方案做比较,jwt的一个显而易见的优势是无

2022-06-06 00:18:27 159

原创 【项目实训】校验注解

在web项目中常常要做参数校验,如果把参数校验都和业务代码混杂在一起,会使代码显得臃肿,降低代码的可读性。参数校验是一个这么普遍的需求,于是JCP组织定义了一个标准(JSR303)来规范化这个任务操作,那就是Java Validation API。但没有提供实现,而是对这个规范的实现,并增加了校验注解如、等。是对的二次封装,用于支持参数自动校验。JSR303支持的校验注解如下: 提供的扩展注解如下: 上述两种皆可 通常、请求会使用传递参数,在controller层我们用对象接收参数。那么只要该对

2022-06-05 23:26:14 569

原创 【项目实训】AOP日志

我们知道,AOP是Spring Framework的两大特性之一,AOP通俗地讲就是可以实现对方法的增强,并且是以代码侵入性低的方式。其底层实现基于动态代理,如果代理对象没有实现某个接口,那么会用jdk代理,如果实现了某个接口,就用CGlibAOP的一个常见使用场景就是日志代码实现AOP有多种方式,这里我们用最常用的一种,即基于注解的方式定义注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Docume

2022-06-05 00:09:24 214

原创 【项目实训】Druid

Druid号称是Java语言中最好的数据库连接池Druid支持所有JDBC兼容的数据库,相比其他的数据库连接池,它针对oracle,mysql等还做了特殊优化。(如针对Oracle的PSCache优化了内存占用)此外还支持监控统计功能,能监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息,可以清楚知道连接池和SQL的工作情况,能够详细统计SQL的执行性能,方便分析数据库的访问性能。配置(基于springboot)引入依赖<depend

2022-05-15 01:24:05 94

原创 【项目实训】Swagger2

当前,前后端分离已是主流,接口文档的编写就显得尤为重要了但对后端来说,写文档实在是一种巨大的心智负担(注释都不写,写啥文档:)自己手动写文档的方式不仅是初期写的时候很麻烦,而且后续维护也会很大困难(试想你后端接口改了个参数,但接口文档没及时更新,估计前端已经口吐芬芳了),更别说手动写的方式还很容易写错,实在是吃力不讨好。于是swagger横空出世Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RES

2022-05-15 00:55:26 131

原创 【项目实训】MybatisPlus

项目的dao层我用了MybatisPlus,作为一个mybatis的增强框架,使用上我们既免去了使用mybatis时对简单的单表操作还要写sql的繁琐,同时又兼顾了灵活性(你依然可以按照mybatis那种方式去写较复杂的联表sql等 PS:现在实践上也是建议尽量避免出现关联查询,对关联查询拆为多个单表查询,可以有很多好处,如利于代码复用,提升查询性能,利于扩展维护等)mybatis plus的官网介绍:MyBatis-Plus(opens new window)(简称 MP)是一个MyBat..

2022-05-15 00:24:18 404

原创 【项目实训】Bean拷贝工具类

我们知道在MVC开发过程中,各个层之间往往有不同的对象在函数调用中传递,而这些对象虽然类型不同,但往往是有很多相同的属性,典型的比如数据库能查到很多数据,但在服务层我们需要用的只是其中一部分,或者我们希望给用户展示/暴露的只是一部分,那么在这种场景下,我们就需要bean拷贝工具类(当然你也可以直接写get,set,这样性能也很好,但却给开发与维护带来了许多不便)。主流的bean拷贝实现大致有Apache BeanUtils ,SpringBeanUtils,cglibBeanCopier,Huto...

2022-05-14 23:43:53 616

原创 【项目实训】统一异常处理

在上一篇文章中,我们使用了统一响应格式,这保证了我们在经过正常的控制器处理流程后,都能返回统一的数据格式,这为开发带来了便利。但这还不够,一个web程序几乎不可避免地要处理各种异常,最基本的,比如数据校验。在发生了异常后,我们希望response数据响应格式依然不变。为此,我们使用spring提供的@ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理(当然由于我们统一返回的数据都是json,所以直接用@RestControllerAdvice即可)代码@

2022-05-14 01:02:43 119

原创 【项目实训】统一响应格式

前后端分离统一响应格式在前后端分离项目中,后端返回的数据都是json格式此外,我定义了统一的消息响应体使得我们项目的三个前端(小程序,App,PCweb)都有较为统一的处理逻辑,并且在调试过程或生产环境中,发生特定错误,也有利于我们定位错误(利用状态码等)代码实现 @ApiModelProperty("状态码") private Integer code; @ApiModelProperty("消息") private String msg; @

2022-04-23 16:40:25 466

原创 zookeeper学习总结(十四)

2021SC@SDUSC前言经过这一学期对zookeeper源码的学习,我对Znode(DataNode),Watch,ACL等zookeeper中基本的概念有了较为深入的理解Znode

2021-12-27 23:20:30 1015

原创 zookeeper源码解析(十三)

2021SC@SDUSCACL基本概念ZooKeeper 的权限管理亦即ACL控制功能,使用ACL来对Znode进行访问控制。ACL的实现和Unix文件访问许可非常相似:它使用许可位来对一个节点的不同操作进行允许或禁止的权限控制。但是和标准的Unix许可不同的是,Zookeeper对于用户类别的区分,不止局限于所有者(owner)、组 (group)、所有人(world)三个级别。Zookeeper中,数据节点没有"所有者"的概念。访问者利用id标识自己的身份,并获得与之相应的不同的访问权限。深

2021-12-26 23:21:01 729

原创 zookeeper源码解析(十二)

2021SC@SDUSCDataTree函数方法cachedApproximateDataSize: //返回所有DataNode的路径和数据所占的空间大小 public long cachedApproximateDataSize() { return nodeDataSize.get(); }isSpecialPath: //判断是否是特殊路径(/,/zookeeper,/zookeeper/config,/zookeeper/quo.

2021-12-17 23:54:40 1368

原创 zookeeper源码解析(十一)

2021SC@SDUSC前言上一篇文章我们对DataTree类的每一个变量的含义都做了具体的阐释,本文将继续介绍DataTree类的函数方法。函数方法之前的文章中已经介绍过DataTree的构造函数,在此不再赘述。addConfigNode:添加配置节点,其完整路径为/zookeeper/config,用于维护zookeeper的配置信息。public void addConfigNode() { DataNode zookeeperZnode = nodes.

2021-12-11 23:12:24 1130

原创 zookeeper源码解析(十)

2021SC@SDUSC前言经过前文对DataTree中所用到的各种类的源码的分析后,我们再次回到DataTree类,深入了解DataTree究竟维护了哪些变量,实现了哪些功能。静态变量 //日志 private static final Logger LOG = LoggerFactory.getLogger(DataTree.class); //根节点路径 private static final String rootZookeeper =

2021-12-05 21:42:58 1342

原创 zookeeper源码解析(九)

2021SC@SDUSC前言本节介绍PathTrie类的静态内部类TrieNode,即字典树的节点类TrieNode成员变量 //节点存储的值 final String value; //Map,存储子节点的value到子节点的映射 final Map<String, TrieNode> children; //property为true,当且仅当对应的路径(从根节点到该节点)存在

2021-11-28 23:44:08 942

原创 zookeeper源码解析(八)

2021SC@SDUSC前言本节介绍PathTrie类,它是zookeeper中对字典树的实现(传统的字典树一个节点或者一条边存储的是一个字符,这里则是对路径分割后的字符串),在DataTree类中用于记录配额节点。PathTrie成员变量: //该类的日志 private static final Logger LOG = LoggerFactory.getLogger(PathTrie.class); //根节点 private final

2021-11-21 23:15:55 1118

原创 zookeeper源码解析(七)

2021SC@SDUSC前言本节介绍DataTree类内部的三个辅助类ProcessTxnResultProcessTxnResult是内部静态类成员变量: public long clientId; public int cxid; public long zxid; public int err; public int type; public String path;

2021-11-14 23:48:30 1637

原创 zookeeper源码解析(六)

2021SC@SDUSCWatchManager我们接着分析WatchManager类的成员函数removeWatcher方法 public synchronized void removeWatcher(Watcher watcher) { //从watch2Paths中移除watcher,返回watcher所对应的path集合,存在paths变量中 Set<String> paths = watch2Paths.remove(watch

2021-11-07 23:55:56 364

原创 zookeeper源码解析(五)

2021SC@SDUSCIWatchManagerzookeeper的watch管理器接口 //将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher boolean addWatch(String path, Watcher watcher); //将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher //并且设置了watcher模式 default boolean a

2021-10-31 22:55:56 902

原创 zookeeper源码解析(四)

2021SC@SDUSCDataNodezookeeper中的数据节点类这个类包含了zookeeper的DataTree模型中一个节点相关的数据。成员变量: // 我们前文介绍过的一个节点的digest属性,在zookeeper //中计算digest的实现类里是通过path, data和stat计算得到的 private volatile long digest; // 记录节点的digest(digest)是否计算好了 //可以看作是空间换时

2021-10-24 23:21:24 73

原创 zookeeper源码解析(三)

2021SC@SDUSC前言NodeHashMap是DataTree类所维护的最核心的成员变量的变量类型。NodeHashMap是接口,且在zookeeper中提供了它唯一一个实现类NodeHashMapImpl。本文主要介绍该接口和该实现类。NodeHashMap //把数据节点加入map,并更新digest DataNode put(String path, DataNode node); //把数据节点加入map,不更新digest DataNode

2021-10-17 22:26:58 98

原创 zookeeper源码解析(二)

2021SC@SDUSC前言本文介绍上一篇文章中DataTree构造函数传入的参数digestCalculator,来看一下它所属的类。DigestCalculator该类的对象主要用于计算一个给定的数据节点的digest,关于digest,我想应该是和hash有关的一种说法,我们知道hash将大范围的数据映射到小范围,在加密领域,通常会体现会得到一个固定长度的数字或字符串,称为消息摘要,所以称digest。而在该类中,主要是使用CRC校验,来保障数据的完整性,这相比于hash函数,不.

2021-10-10 22:58:18 137

原创 zookeeper源码解析(一)

前言从ZKDatabase说起server.ZKDatabase类:该类维护了zookeeper的树形结构数据模型,

2021-10-03 23:57:17 345 2

原创 zookeeper介绍及源码环境搭建

目录一、zookeeper项目背景二、zookeeper简介三、zookeeper源码环境搭建四、总结一、zookeeper项目背景Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。关于“ZooKeeper”这个项目的名字,其实也有一段趣

2021-09-29 23:30:00 519

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除