`
dazuiba
  • 浏览: 130865 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用动态代理实现权限管理-just a demo

F# 
阅读更多
jive中代理漫天飞,其中代理有两个用处,1 访问控制;2对象缓存。这两个归究还是一个问题。所以只提访问控制。

jive 做的代理思路如下:
先定义一个接口,共代理和被代理的类继承
public interface Forum {

	public List getThreads();;
	public String getName();;
}


有一个具体实现类(被代理类):

public class DbForum implements Forum {

	private Log logger = LogFactory.getLog(this.getClass(););;

	public List getThreads(); {
		logger.info("正在取出论坛的帖子");;
		return Arrays.asList(new String[] { "topic1", "topic1", "topic1" });;

	}

	public String getName(); {
		logger.info("正在取出论坛的名称");;
		String name = "论坛名";
		return name;
	}

}

第三:代理类,用于控制被访问对象DbForum
/*
 * 在DbForum的方法执行前,做一些比如权限检查的操作
 */public class ForumProxy implements Forum {

	private Log logger = LogFactory.getLog(this.getClass(););;

	private Forum forumImpl;

	private Auth auth;

	public ForumProxy(Forum forumImpl, Auth auth); {
		this.forumImpl = forumImpl;
		this.auth = auth;
	}

	public List getThreads(); throws UnAuthorizedException {
		if (auth.isAuthorized();); {
			logger.debug("权限检测通过!");;
			return forumImpl.getThreads();;
		}
		logger.warn("权限检测没有通过,抛出异常");;
		throw new UnAuthorizedException();;
	}
               public String getName();{return forumImpl.getName();;}


}


使用时就是这样了:
              Forum f=new DbForum();;
	        Auth auth=new Auth(true);;
	        ForumProxy fproxy=new ForumProxy(f,auth);;
		try {
			System.out.print(fproxy.getThreads(););;
		} catch (UnAuthorizedException e); {
			// 无权限
			e.printStackTrace();;
		}

#########################################
大家会看到,这样用代理,有好处也有坏处。
坏: 使代码量翻倍,增大了开发难度
好:使业务对象更加专注于业务逻辑,将烦琐而又必须的操作(权限检查,日志打印)转给代理类来完成。
而本文着重介绍的技术叫:动态代理,在JDK1.3后引入java,先看看动态代理是如何做上述权限控制的。
先看动态代理的Client代码:

		/*
		 * 动态代理,将切面和被代理的业务对象完全分开
		 */
                                // 业务对象,关注于业务细节
		Object protectedObject = new DbForum();;
                          
		Auth auth=new Auth(true);;

// 切面对象,拦截业务对象方法的执行,并在被保护对象执行前后做自己的处理
		InvocationHandler guarder = new Guarder(protectedObject,auth);;

		/*
		 * 构造出的代理对象,将前两者巧妙地结合起来,你 只需去调用该对象的方法,
而实际上是调用了 切面对象的相应的方法。
		 */
Forum proxy = (Forum); Proxy.newProxyInstance(protectedObject.getClass();.getClassLoader();, protectedObject.getClass();.getInterfaces();, guarder);;
		

		List threads = proxy.getThreads();;
	    
		proxy.getName();;
     

看见没有,所有的烦琐的权限控制都在InvocationHandler guarder 里面呢。这个接口你得自己实现了。这个接口只有一个方法:
	    public Object invoke(Object proxy, Method method, Object[] args);
	throws Throwable;
  
分享到:
评论

相关推荐

    just-another-stamp-font-demo.zip_DEMO_font

    总的来说,"Just Another Stamp Font Demo"提供了一个体验独特设计风格的机会,同时提醒我们尊重和遵守字体的使用权限。对于设计师而言,试用不同的字体是创新过程中的重要步骤,而这样的免费试用版则为他们提供了...

    justadll - just a dll

    justadll - just a dll

    kbase-ui-plugin-demo-just-panel

    【kbase-ui-plugin-demo-just-panel】是一款基于JavaScript开发的用户界面插件示例,主要用于展示如何构建和集成UI插件。这个项目的核心目标是提供一个基础模板,帮助开发者快速理解并实现自己的KBase UI插件。从...

    Android代码-kotlin-web-demo

    Before starting the Kotlin-Web-Demo execute two gradle tasks: copyKotlinLibs for downloading kotlin libraries for compiler and war for building war-archive from IDE or terminal: $ gradlew ::...

    前端开源库-justo-plugin-fs

    5. **文件权限管理**:检查和修改文件的读写权限,确保操作的安全性。 6. **流处理**:支持对大文件进行流式处理,避免一次性加载整个文件导致内存溢出。 7. **文件和目录的比较**:比较文件内容或目录结构,用于...

    swift-Just是一个Swift的HTTP客户端库受python-requests启发

    - **自定义会话配置**: Just允许开发者自定义URLSession配置,如证书、代理设置等。 - **会话共享**: 利用Swift的URLSession共享,可以确保多个请求间的会话一致性。 8. **中间件支持**: - Just提供了中间件...

    前端开源库-just-kebab-case

    解压后,你可以查看其内部结构,学习如何安装、配置和使用"just-kebab-case"库。通常,库的使用方法会在README文件中进行详细说明,包括npm安装指令、API接口介绍以及一些示例代码。 总之,"just-kebab-case" 是一...

    java-实现足球计算器功能-JustTest.zip

    java_实现足球计算器功能_JustTest.zip java_实现足球计算器功能_JustTest.zip java_实现足球计算器功能_JustTest.zip java_实现足球计算器功能_JustTest.zip java_实现足球计算器功能_JustTest.zip java_实现足球...

    springwebflux的demo

    return Mono.just("Hello, WebFlux!"); } ``` 在这个例子中,`hello()`方法会返回一个单值`Mono`,当请求到达时,它将非阻塞地发送"Hello, WebFlux!"字符串。 **路由功能** WebFlux 使用`RouterFunction`和`...

    Just a vue demo for study

    Just a vue demo for study.....

    开源项目-pawelad-just-scored.zip

    【开源项目-pawelad-just-scored.zip】是一个由开发者 Pawel Adamcik 创建的开源项目,旨在为世界杯足球赛事的粉丝们提供一个基于 Lambda 的 Slack 应用程序。这个应用利用了 Amazon Web Services(AWS)的无服务器...

    Android-Just-Another-Android-App.zip

    Android-Just-Another-Android-App.zip,一个android基础应用程序,包含大量的酷库/配置,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。

    swift-JustLog将iOS上的日志记录提升到更高级别

    在代码中,`swift-JustLog`可能提供了简洁的API,允许开发者轻松地在各个类和函数中插入日志语句,而无需关心具体的输出实现。例如,可能有类似`JustLog.info("这里是日志信息")`的语法,使得代码的可读性和维护性...

    前端项目-just-animate.zip

    本项目“前端项目-just-animate.zip”提供了一个名为“just-animate”的Web动画库,专为前端开发者设计,旨在简化和增强网页的动态效果。 “just-animate”是一个专门针对Web动画的库,其主要目标是帮助开发者创建...

    藏经阁-KR^X- Comprehensive- Kernel-Protection-Against-Just-In-Time-

    此外,KR^X可能还涵盖了其他内核保护措施,例如动态的内存管理和权限控制,以防止未授权的访问和操作。这样的解决方案可能会监控内核中的数据流,以检测异常行为并及时阻止潜在的攻击。通过这种方式,KR^X旨在创建一...

    Android-just零依赖NPM工具类模块库每个模块只实现一个功能

    在"Android-just"库中,你可以找到一系列精心设计的工具类,涵盖了Android开发中的各种常见需求,如网络请求、数据序列化、日志打印、权限管理、线程控制等。这些工具类都是独立的,可以根据项目需求选择性地引入,...

    前端开源库-justo-plugin-jshint

    此外,"justo-plugin-jhint"还支持与其他JUSTO插件集成,比如配合使用UglifyJS进行代码压缩,或者使用Babel进行ES6+语法转换,实现现代JavaScript的开发和旧浏览器的兼容。 总的来说,"前端开源库-justo-plugin-...

    C Programming - Just the FAQS - PDF.rar

    4. **内存管理**:C语言允许程序员直接管理内存,包括动态分配和释放内存。这涉及到了malloc()、calloc()、realloc()和free()函数的使用,理解它们的用途和潜在陷阱是防止内存泄漏的关键。 5. **预处理器**:预...

    C Programming - Just the FAQs

    ### C Programming - Just the FAQs #### 一、书籍概述与背景 《C Programming - Just the FAQs》是一本由多位作者合作完成的专业性书籍,其中包括了Paul S. R. Chisholm、David Hanley、Michael Jones、Michael ...

    前端开源库-justo-plugin-eslint

    通过Justo,开发者可以构建模块化、可维护的前端项目,并享受到自动化任务管理、代码质量和性能优化等优势。Justo框架的设计理念是简化开发过程,提高开发效率,使得开发者能够更专注于业务逻辑的实现。 **ESLint...

Global site tag (gtag.js) - Google Analytics