- 浏览: 120492 次
- 性别:
- 来自: 广西
文章分类
最新评论
-
greemqqran:
这方法 源码,是怎么的哦?
可变参数,数组与集合之间的转换 -
greemqqran:
Arrays.asList
可变参数,数组与集合之间的转换 -
ricoyu:
引用? super E:接收的是E类型对象应该是: ? sup ...
泛型-
首先第一步我们需要定义一个接口UserDao
package cn.dhcool.proxy.auth; public interface UserDao { @Auth("admit") public abstract void addUser(); @Auth("admit") public abstract void delUser(); @Auth("admit") public abstract User findUser(); @Auth("admit,user") public abstract void updataUser(); }
一个实现类UserDaoImp
package cn.dhcool.proxy.auth; public class UserDaoImp implements UserDao { @Auth("admit") public void addUser(){ System.out.println("add"); } @Auth("admit") public void delUser(){ System.out.println("delUser"); } @Auth("admit") public User findUser(){ System.out.println("findUser"); return null; } @Auth("admit,user") public void updataUser(){ System.out.println("updataUser"); } }
基本用户权限Domain: User
package cn.dhcool.proxy.auth; public class User { private String userName; private String role; public User() { } public User(String userName, String role) { this.userName = userName; this.role = role; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } }
用于获取动态代理类的工具类 : ProxyClass
package cn.dhcool.proxy.auth; import java.lang.reflect.Proxy; public class ProxyClass { //真实对象 private Object realObject; private User user; public ProxyClass(Object realObject,User user) { this.realObject = realObject; this.user = user; } public Object newProxyInstance(){ return Proxy.newProxyInstance(this.realObject.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(),new MyInvocationHandler(realObject,user)); } }
注解的定义:Auth
package cn.dhcool.proxy.auth; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Auth { public String value(); }
接口回调:MyInvocationHandler
package cn.dhcool.proxy.auth; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler{ private Object realObject; private User user; public MyInvocationHandler(Object realObject,User user){ this.realObject = realObject; this.user = user; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String role = user.getRole(); //获取代理类调用的方法名 String methodName = method.getName(); //反射获取真实类的方法 Method realMethod = this.realObject.getClass().getMethod(methodName,method.getParameterTypes()); //判断真实的方法是否有注解 if(realMethod.isAnnotationPresent(Auth.class)){ Auth auth = realMethod.getAnnotation(Auth.class); String[] auths = auth.value().split(","); //循环遍历该方法能访问的角色是否包含该用户的角色 for (int i = 0; i < auths.length; i++) { if(auths[i].equals(role)){ return realMethod.invoke(realObject, args); } } throw new RuntimeException("你没有这个权限"); } return null; } }
客户端调用:
package cn.dhcool.proxy.auth; public class Client { public static void main(String[] args) { //创建真实对象 UserDao userDao = new UserDaoImp(); //创建用户 User user = new User("lhc","user"); ProxyClass proxyClass = new ProxyClass(userDao, user); UserDao userDaoProxy = (UserDao)proxyClass.newProxyInstance(); userDaoProxy.updataUser(); } }
发表评论
-
JDK动态代理模式
2012-12-22 21:51 900package cn.dhcool.dynamic.proxy ... -
代理proxy模式
2012-12-22 20:45 0静态代理模式: 需要有一个公共的借口,还有一个真实的实现类, ... -
工厂模式下出现的问题-null异常
2012-12-15 18:31 922遇到了一个问题: public class Dao ... -
内部类详解
2011-12-09 21:23 668从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论 ... -
动态代理实现
2011-11-22 02:03 1048package com.dhcool.proxy; ... -
内省总结
2011-11-19 02:43 846package com.dhcool.introspec ... -
线程锁
2011-10-10 13:27 822sleep(), wait(),yield(),这3个方法,s ... -
类似百度谷歌分页算法实现
2011-09-08 15:58 1596<%@ page language="j ... -
充当服务端代码
2011-08-05 16:53 676import java.net.*; import java ... -
获取文件中邮件的示例
2011-08-05 12:25 737import java.util.regex.*; impo ... -
正则表达式常用字符
2011-08-05 12:22 922构造 匹配 字符 x 字符 x ... -
正则表达式
2011-08-05 12:16 847第一种:1.定义匹配规则如:String qqreg = &q ... -
InetAddress
2011-08-04 21:59 905import java.net.*; class Inet ... -
B/S socket
2011-08-04 21:08 1030import java.net.*; import java ... -
TCP多线程文件上传
2011-08-04 14:51 898/* 上传图片 */ import java.io.*; ... -
网络编程基础
2011-08-04 14:25 838网络编程: 网络通讯中所需要了解的一些内容。 T ... -
一道题
2011-08-02 21:05 614/* 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 ... -
TCP
2011-08-02 20:46 781import java.net.*; import ja ... -
UDP
2011-08-02 20:35 864import java.net.*; import java ... -
mypad小程序
2011-08-02 15:48 755package menupack; import jav ...
相关推荐
总的来说,通过动态代理和注解的结合,我们可以方便地实现细粒度的权限管理,不仅提高了代码的可读性和可维护性,还使得权限控制逻辑与业务逻辑相分离,降低了系统的复杂性。这种方式在大型系统中尤为适用,例如在...
此外,`bookstore`可能是一个示例应用,其中包含了使用这种动态代理和注解实现的权限管理机制。这个应用可能包括用户登录、角色分配、权限设置以及带有权限注解的方法等组件。 总之,通过动态代理和注解的结合,...
拦截器是基于Java的动态代理模式实现的,它们在Action调用前后执行,形成一个拦截器链。每个拦截器都可以执行特定的任务,如验证用户、记录日志等。通过配置Struts配置文件或使用注解,我们可以指定拦截器的执行顺序...
总的来说,这个例子展示了如何将Spring的AOP和CGLIB结合,通过注解实现一个简单的权限控制系统。虽然文中提到这个例子可能并不适用于实际生产环境,但它提供了一个理解和学习AOP和CGLIB如何协同工作的基础。在实际...
### 反射与注解在Struts2中的应用——实现精细权限控制 #### 一、引言 在软件开发过程中,权限控制是一项重要的安全措施,它确保系统的不同部分只能被授权用户访问。对于大型管理系统(MIS)而言,基于方法级别的...
为了实现这一目标,开发者通常会在需要权限控制的方法上添加特定的注解,例如`@VersionPermission`。此注解可以携带权限参数,如产品版本(`ProductType`)和体验券类型(`ExperienceType`)。这样,AOP框架能够在...
在Struts2中,拦截器是基于Java的动态代理机制实现的。当一个请求到达时,Struts2会按照配置的顺序依次调用拦截器链中的每个拦截器,直到到达Action执行,然后按照相反的顺序返回。拦截器可以用来处理预处理任务(如...
- 使用`AuthorizationAttributeSourceAdvisor`和`DefaultAdvisorAutoProxyCreator`来启用AOP代理,实现基于注解的权限控制。 - 配置`FilterRegistrationBean`和`ServletListenerRegistrationBean`来注册CAS的过滤...
【Springboot+Vue+shiro实现前后端分离、权限控制】 在现代Web开发中,前后端分离是一种常见的架构模式,它可以提高开发效率并优化用户体验。Springboot与Vue.js的结合,加上Shiro的安全框架,可以构建出高效、安全...
综上所述,结合Spring和STOMP,我们可以构建出强大的WebSocket应用,实现广播订阅、权限控制和一对一通讯功能,满足实时交互的需求。通过`websocket-spring-demo`这个示例项目,你可以深入学习并实践这些概念。
在Spring Boot应用中,数据权限校验是后端开发中的重要环节,确保用户只能访问他们被...在实际应用中,还可以根据项目需求进一步扩展和完善权限验证机制,比如支持更复杂的角色-权限模型,或者实现细粒度的资源控制。
在Spring Boot中,我们可以使用注解驱动的AOP,通过定义切面类和切点表达式来实现权限控制。例如,我们可以创建一个名为`AuthorizationAspect`的切面类,其中包含一个或多个通知方法,这些方法会在匹配的切点执行时...
这通常通过动态代理和注解实现。动态代理可以在运行时创建一个代理对象,该对象在调用目标方法之前和之后执行额外的逻辑,比如检查权限。Spring框架提供了一种包装设计模式,使得可以在不修改原有代码的情况下增强...
Spring 整合 Apache Shiro 是一个常见的权限控制解决方案,它可以帮助开发者轻松地实现用户登录、权限验证、会话管理等功能。在这个案例中,我们将深入探讨如何将 Shiro 与 Spring 结合使用,构建一个完整的权限控制...
在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...
在企业级应用开发中,数据权限控制是必不可少的一部分,它涉及到不同用户或角色对数据库中数据的访问范围。Spring AOP(面向切面编程)是一个强大的工具,常用于实现业务逻辑中的横切关注点,如日志、事务管理以及...
在Java Web开发中,安全控制是至关重要的一个环节,Acegi Security(现已被Spring Security替代)就是这样一个专门用于实现用户权限控制的框架。本实例将详细介绍如何使用Acegi Security来管理用户权限,确保系统...
- **权限控制**:定义角色和权限,只允许特定用户或角色访问某些服务。 在提供的压缩包中,`ws_server`项目包含了服务端的实现,而`ws_client`项目则为服务的消费者。服务端通常会包含服务接口和其实现,以及可能...
6. **设计模式**: SSM系统可能会使用一些常见的设计模式,如工厂模式(用于创建对象)、单例模式(全局只有一个实例)、代理模式(用于权限控制)等,以提高代码的可读性和可维护性。 7. **数据库设计**: 数据库...
在你的问题中,“shiro 注解不起作用”可能指的是你在使用Shiro的注解进行权限控制时遇到了问题。Shiro 提供了诸如`@RequiresAuthentication`, `@RequiresPermissions`, `@RequiresRoles`等注解,用于在方法级别进行...