首页 > Reflex

RPC : Remote Procudure Call
不同计算机之间的方法可以远程调用,这个就是RPC最重要的概念

但是由于程序是运行在不同的机器中的,两个机器之间并没有联系,要是想实现调用其他机器上的方法如同在调用本机的方法一样的效果 该如何做到?

我用了最基本的BIO来实现这个需求,要实现这种需求, 客户端和服务端两个角色是必要的。

 

客户端调用过程大概这样,注意 这个 HelloService 是一个接口,并且在client服务中没有实现, 具体的实现在另一个服务,这么说有点像Feign的感觉,不过Feign底层用的是HttpClient。

 

HelloService 很简单,就一个方法

 

服务端的启动:

 

我个人在本机上是完全实现了相对应的效果的,即Client服务调用了Server服务的方法(这俩服务不在一个项目里)

这里只贴了启动和调用的代码,具体实现看github: https://github.com/skypyb/framework_impl/tree/master/rpc

阅读全文

 

又到了我第二喜欢的玩反射时间了。真快乐啊。

如标题所说,我写了个权限控制。权限控制的精髓就是限制用户访问范围。一个系统,总得有后台、管理者这些绕不开的玩意儿。

还有用户所代表的各种不同角色,如游客、登陆者、管理员、代理商、作者、编辑,等等等等。他们这些角色在一个庞大的系统里能够操作的地方总归是不同的。

如果单单依赖前端的权限控制,难免会被人家利用抓包之类的手段获取其他角色能操作的区域信息来做一些危险操作。

后端的权限控制是必不可少的,当然,在java领域现在SpringSecurity、shiro之类的安全框架肯定是一个优选,我很久之前也写过关于SpringSecurity的配置,可见: Spring Security集成以及配置

但是我就是tm要自己写一个,哎嘿嘿,(⁄ ⁄•⁄ω⁄•⁄ ⁄)

 

咳咳,关于我写的这个权限控制,我自己感觉还是特别骚的。亲自试了两天,确实没什么问题。我需要它能够做它确实做到了。

下面详细解释一下。

这个注解,是关键。里面有一个内部枚举,与其息息相关。注解的唯一一个参数就是该枚举。

@Impower 注解代表需要控制

Level 枚举表示控制范围

 

实现的效果就是:在上(Controller层的)写入该@Impower 注解,例如: @Impower(level = Impower.Level.Admin) ,那么,即代表该类需要权限控制,并且只有 Admin 这个角色,或者比Admin角色权限更高的角色 ,才能够请求该类中的方法。

如果在方法上加入该@Impower 注解,如果@Impower同时存在类上,外部请求该方法时,则会无视类注解,按照方法上该注解来进行判定权限是否能够访问。

Level 枚举内部的权限可自己随意定义,只要保证其权限范围顺序从左到右、从上到下线性递减即可。

注:系统的用户必须有一个属性是以Impower . Level 作为其类型。才能够进行权限控制。

 

前后端均可使用,前台可通过thymeleaf、freemark等模板来对用户显示进行控制,若是前后端分离的项目也没事,请求后台的时候做一下check()判定就好了。

并且想修改非常方便,这已经很极限的做到了降低耦合。想要增加不同的权限也好、修改某些方法可访问的权限也好、前台对权限的控制也好。有变更只需要更改很小的地方。

 

 

这儿是具体进行权限判定、从而决定是否放行的拦截器,关于SpringBoot的拦截器配置,若有不清楚的地方可看我之前写过的文章:

SpringBoot使用WebMvcConfigurerAdapter+HandlerInterceptorAdapter实现拦截

 

这里我对基本只会验证是否登录的拦截器做了拓展,获取了该请求所请求的类、方法上的注解,从而通过Session中的已登录对象来进行判定权限是否能够访问。

会使用Level  中的 check() 方法来进行判定该登陆角色的权限是否能够通过。

若通过判定,则成功访问该页面(能够正常请求响应),若判定失败,则请求失败,但是response状态码仍然会是200,只不过返回的内容是空罢了。

 

又写了一些骚东西,别的不嗦,我这玩意写出来还真挺好用的。实际体感顺滑流畅,代码优雅,功能简洁却强悍。

但是后端的权限控制可不止这么点哦,最好与JWT(JSON Web Token)进行同步使用,我本来也想自个写个Token验证之类的玩玩,妈耶想起来是有点麻烦,还是算了,我还是挺懒得。

阅读全文

在看李刚著的《疯狂java讲义》 反射这一部分介绍了非常多的新特性,让我大呼:原来还能这样操作?于是赶紧记录下来

 

Java8在java.lang.reflect包下新增了一个Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method俩子类

 

Executable基类提供了大量的方法来获取修饰该方法或构造器的注解信息;还提供了isVarArgs ()方法用于判断该方法或构造器是否包含可变数量的形参,以及通过getModifiers()方法来获取该方法或构造函器的修饰符,除此之外Executable提供了如下俩个方法来获取该方法或该参数的形参个数以及形参名。

Int getParameterCount():     获取该构造器或方法的形参个数

Parameter[] getParameters():      获取该构造器或方法的所有形参

 

上面第二个方法烦恼会了一个Parameter[]数组,Parameter也是java8新增的API,每个Parameter对象就代表方法或者构造器的一个参数,parameter也提供了大量的方法来获取声明该变量的泛型信息,还提供了如下常用方法来获取参数信息。

>getModifiers()   获取修饰该形参的修饰符

>String getName():     获取新参名

>Type getParameterizedType():       获取带泛型的新参类型

>Class<?> getType():  获取形参类型

>boolean isNamePresent():      该方法返回该类的class文件中是否包含了方法的形参名信息

>boolean iaVarArgs(): 该方法用于判断该参数是否为可变形参

 

阅读全文

自己造轮子还是有意思啊

 

 

工厂模式

 

根接口

 

具体实现类之结果集一行转换为对应对象

 

 

 

具体实现类之基本数据类型及String及包装类的转换

 

具体实现类之Deta类的转换

 

阅读全文

 

 

这回增删改都有啦,除了上次写的那个返回一个集合的以外,还加了个查询单条数据只返回一个对象的重载方法

增删改倒是挺简单的

 

 

阅读全文