1.使用静态代理为系统操作添加安全性检查

实例结构图

业务接口定义

package com.dennist.dao;
public interface UserDao {public void addUser(String name, String password);public void deleteUser(int id);public void updateUser(int id, String name, String password);public String queryUser(int id);}

接口的实现

package com.dennist.dao.impl;
import com.dennist.dao.UserDao;public class UserDaoImpl implements UserDao{@Overridepublic void addUser(String name, String password) {System.out.println("UserDaoImpl.addUser()");}@Overridepublic void deleteUser(int id) {System.out.println("UserDaoImpl.deleteUser()");}@Overridepublic String queryUser(int id) {System.out.println("UserDaoImpl.queryUser()");return null;}@Overridepublic void updateUser(int id, String name, String password) {System.out.println("UserDaoImpl.updateUser()");}}

使用静态代理添加安全性检测

package com.dennist.dao.impl;
import com.dennist.dao.UserDao;public class UserDaoImplProxy implements UserDao{private UserDao userDao;public UserDaoImplProxy(UserDao userDao){this.userDao = userDao;}@Overridepublic void addUser(String name, String password) {checkSecurity();this.userDao.addUser(name, password);}@Overridepublic void deleteUser(int id) {checkSecurity();this.userDao.deleteUser(id);}@Overridepublic String queryUser(int id) {checkSecurity();return this.userDao.queryUser(id);}@Overridepublic void updateUser(int id, String name, String password) {checkSecurity();this.userDao.updateUser(id, name, password);}public void checkSecurity(){System.out.println("---------checkSecurity---------");}
}

客户端测试代码

package com.dennist.client;
import com.dennist.dao.UserDao;
import com.dennist.dao.impl.UserDaoImpl;
import com.dennist.dao.impl.UserDaoImplProxy;public class ClientOpt {public static void main(String[] args) {UserDao userDao = new UserDaoImpl();UserDaoImplProxy userDaoImplProxy = new UserDaoImplProxy(userDao);userDaoImplProxy.addUser("dennisit", "dennisit@163.com");userDaoImplProxy.deleteUser(5);}
}
运行结果:
---------checkSecurity---------
UserDaoImpl.addUser()
---------checkSecurity---------
UserDaoImpl.deleteUser()

2.使用JDK的动态代理

需要实现java.lang.reflect.InvocationHandler接口

实例结构图

业务接口定义与实现同上,JDK代理实现代码如下

package com.dennist.dao.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class SecurityHandler implements InvocationHandler{private Object targetObject;public Object newProxy(Object targetObject){this.targetObject = targetObject;//面向接口编程,安全认证加在接口上.return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {checkSecurity();Object result = null;try {result = method.invoke(this.targetObject, args);} catch (Exception e) {e.printStackTrace();}return result;}public void checkSecurity(){System.out.println("---------checkSecurity---------");}
}

客户端测试代码

package com.dennist.client;
import com.dennist.dao.UserDao;
import com.dennist.dao.impl.SecurityHandler;
import com.dennist.dao.impl.UserDaoImpl;public class ClientOpt {public static void main(String[] args) {SecurityHandler handler = new SecurityHandler();UserDao userDao = (UserDao) handler.newProxy(new UserDaoImpl());userDao.addUser("zhangan", "pwd123");userDao.deleteUser(5);}
}
运行结果:
---------checkSecurity---------
UserDaoImpl.addUser()
---------checkSecurity---------
UserDaoImpl.deleteUser()

3.使用springAOP动态织入(使用xml配置)

springAOP默认采用JDK的动态代理.

项目结构图

业务dao与dao实现同上

定义安全检测方法

package com.spring.dao.impl;public class SecurityHandler {public void checkSecurity() {System.out.println("----------checkSecurity()---------------");}
}

applicationContext.xml中的配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"><bean id="securityHandler" class="com.spring.dao.impl.SecurityHandler"/>           <bean id="userDao" class="com.spring.dao.impl.UserDaoImpl"/><aop:config><aop:aspect id="securityAspect" ref="securityHandler"><aop:pointcut id="allAddMethod" expression="execution(* query*(..))||execution(* add*(..))"/><aop:before pointcut-ref="allAddMethod" method="checkSecurity"/></aop:aspect></aop:config></beans>

客户端测试

package com.spring.client;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.dao.UserDao;public class ClientOpt {public static void main(String[] args) {BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) factory.getBean("userDao");userDao.addUser("zhangsan", "pwd123");System.out.println("");userDao.deleteUser(5);System.out.println("");userDao.queryUser(3);}
}
运行效果:
----------checkSecurity()---------------
UserDaoImpl.addUser()UserDaoImpl.deleteUser()----------checkSecurity()---------------
UserDaoImpl.queryUser()

spring对AOP的支持

如果目标对象实现了接口,默认会采用JDK的动态代理机制实现AOP

如果目标对实现了接口,可以强制使用CGLIB实现AOP

如果目标对象没有实现接口,必须使用CGLIB生成代理,spring会自动在CGLIB和JDK动态代理之间切换.

如何强制使用CGLIB生成代理?

1.添加CGLIB库

2.在spring的配置文件中加入:<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK代理和CGLIB代理的区别?

JDK代理只能对实现了接口的类生成代理,而不能针对类

CGLIB是针对类实现代理的,主要对指定的类生成一个子类,并覆盖其中的方法,因为是继承,所以不能使用final来修饰类或方法.

转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/02/16/2913272.html]

转载于:https://www.cnblogs.com/dennisit/archive/2013/02/16/2913272.html

使用代理为业务操作添加安全检测相关推荐

  1. 基于fiddler插件的代理扫描系统:越权漏洞检测

    基于fiddler插件的代理扫描系统:越权漏洞检测 # 概述 ##越权检测原理 ###系统架构 #基本步骤 待优化与工具联动 工具联动: 其他漏洞检测 # 概述 随着现在企业安全水平的提高, 单独依赖 ...

  2. oracle erp 财务入门,Oracle ERP EBS 顾问财务模块基本业务操作专题

    课程目标: OraEBSR1201登录    OraEBSR1202添加收藏夹    OraEBSR1203快捷键查询和保存    OraEBSR1204提交请求查看请求结果    OraEBSR12 ...

  3. Pytorch v0.4.1发布:添加频谱范数,自适应Softmax,优化CPU处理速度,添加异常检测NaN等

    Pytorch v0.4.1发布:添加频谱范数,自适应Softmax,优化CPU处理速度,添加异常检测(NaN等)以及支持Python 3.7和CUDA 9.2支持 一.目录 突破性的变化 新功能 神 ...

  4. asp.net gridview 模板列 弹出窗口编辑_【线上课堂】中国(辽宁)国际贸易单一窗口企业资质系统业务操作...

    01 系统介绍 "单一窗口"企业资质系统提供商务部资质.海关企业通用资质的申请功能,从事进出口贸易的企业依照有关法律.行政法规和规章的要求,通过"单一窗口"一点 ...

  5. JAVA后端如何保证业务操作的幂等性

    JAVA后端如何保证业务操作的幂等性 说到幂等性,应该很多人都知道这个词,顾名思义,就是无论操作多少次,产生的结果都是相等的.尤其是交易中,在开发过程中,时时刻刻要考虑交易的幂等性,例如,客户端因为网 ...

  6. netty 高匿ip检测_高匿代理ip不用担心被网站检测

    高匿代理ip不用担心被网站检测 市场上关于代理ip的服务有很多种,可谓是鱼目混珠,一些服务虽然可以保证用户切换ip地址,但经常会被举报,暴露真实的ip地址,风险系数极高,让网民们苦不堪言. 近期,以高 ...

  7. oracle总帐的重估逻辑,OraEBSR12GL日记账业务操作23:汇率重估模板定义

    OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...

  8. oracle日记账查询,OraEBSR12GL日记账业务操作16:按汇总模板进行查询

    OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...

  9. oracle日记账导出,OracleEBSR12GL日记账业务操作01:日记账批录入

    OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...

  10. oracle中的冲销日记账,OraEBSR12GL日记账业务操作09:日记账冲销处理

    OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...

最新文章

  1. ios编译与android编译区别是什么,为iOS和Android编译C ++代码(XCode)。 这是真的吗?...
  2. Win7与其它Windows的双系统问题
  3. 【Python基础】使用Matplotlib可视化数据的5个强大技巧
  4. python去掉字符串开头的零_Python / Pandas-删除以字符串开头的列
  5. Web框架——Flask系列之Flask简介(一)
  6. 数据之路 - Python爬虫 - 正则表达式
  7. python计算器gui设计_python 实现简单的计算器(gui界面)
  8. Map的keyset() 方法和entrySet() 方法
  9. Unity UniWebView内置浏览器插件
  10. 计算机文档字体替换,word文档计算机怎样替换字体为黑体
  11. 《三国演义》分章节梗概
  12. oracle 更新数据语句,数据更新语句update
  13. java poi ppt转图片
  14. 小学奥数 7653 地球人口承载力估计 python
  15. 门徒Disciples体系:致力于成为“DAO世界”中的集大成者。
  16. View 5应用之五:iPad与Android携带虚拟桌面
  17. 一个企业上线PLM系统前应该做些什么?杰信PLM
  18. css笔记 vertical-align详解
  19. php 票务系统开发_电子票务系统的意义和实现
  20. ARCore系列教程(1)---创建第一个原生AR应用

热门文章

  1. IPSec之security acl
  2. 【转】windows下GSL的配置
  3. 2019牛客暑期多校训练营(第四场)K-number
  4. 新增对象Products 的流程说明
  5. Composite UI Application Block(Cab)比较详细的一片文章
  6. ElasticSearch经验小结 (Based on 5.x)
  7. 等待线程结束(join)
  8. Linq to xml:检索
  9. 求一天的起始和结束(时间戳)和一个月的第一天和最后一天
  10. Ubuntu Linux 8.04 Vsftp 假造用户设置