使用代理为业务操作添加安全检测
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
使用代理为业务操作添加安全检测相关推荐
- 基于fiddler插件的代理扫描系统:越权漏洞检测
基于fiddler插件的代理扫描系统:越权漏洞检测 # 概述 ##越权检测原理 ###系统架构 #基本步骤 待优化与工具联动 工具联动: 其他漏洞检测 # 概述 随着现在企业安全水平的提高, 单独依赖 ...
- oracle erp 财务入门,Oracle ERP EBS 顾问财务模块基本业务操作专题
课程目标: OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR12 ...
- Pytorch v0.4.1发布:添加频谱范数,自适应Softmax,优化CPU处理速度,添加异常检测NaN等
Pytorch v0.4.1发布:添加频谱范数,自适应Softmax,优化CPU处理速度,添加异常检测(NaN等)以及支持Python 3.7和CUDA 9.2支持 一.目录 突破性的变化 新功能 神 ...
- asp.net gridview 模板列 弹出窗口编辑_【线上课堂】中国(辽宁)国际贸易单一窗口企业资质系统业务操作...
01 系统介绍 "单一窗口"企业资质系统提供商务部资质.海关企业通用资质的申请功能,从事进出口贸易的企业依照有关法律.行政法规和规章的要求,通过"单一窗口"一点 ...
- JAVA后端如何保证业务操作的幂等性
JAVA后端如何保证业务操作的幂等性 说到幂等性,应该很多人都知道这个词,顾名思义,就是无论操作多少次,产生的结果都是相等的.尤其是交易中,在开发过程中,时时刻刻要考虑交易的幂等性,例如,客户端因为网 ...
- netty 高匿ip检测_高匿代理ip不用担心被网站检测
高匿代理ip不用担心被网站检测 市场上关于代理ip的服务有很多种,可谓是鱼目混珠,一些服务虽然可以保证用户切换ip地址,但经常会被举报,暴露真实的ip地址,风险系数极高,让网民们苦不堪言. 近期,以高 ...
- oracle总帐的重估逻辑,OraEBSR12GL日记账业务操作23:汇率重估模板定义
OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...
- oracle日记账查询,OraEBSR12GL日记账业务操作16:按汇总模板进行查询
OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...
- oracle日记账导出,OracleEBSR12GL日记账业务操作01:日记账批录入
OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...
- oracle中的冲销日记账,OraEBSR12GL日记账业务操作09:日记账冲销处理
OraEBSR1201登录 OraEBSR1202添加收藏夹 OraEBSR1203快捷键查询和保存 OraEBSR1204提交请求查看请求结果 OraEBSR1205修改密码和个人Profile O ...
最新文章
- ios编译与android编译区别是什么,为iOS和Android编译C ++代码(XCode)。 这是真的吗?...
- Win7与其它Windows的双系统问题
- 【Python基础】使用Matplotlib可视化数据的5个强大技巧
- python去掉字符串开头的零_Python / Pandas-删除以字符串开头的列
- Web框架——Flask系列之Flask简介(一)
- 数据之路 - Python爬虫 - 正则表达式
- python计算器gui设计_python 实现简单的计算器(gui界面)
- Map的keyset() 方法和entrySet() 方法
- Unity UniWebView内置浏览器插件
- 计算机文档字体替换,word文档计算机怎样替换字体为黑体
- 《三国演义》分章节梗概
- oracle 更新数据语句,数据更新语句update
- java poi ppt转图片
- 小学奥数 7653 地球人口承载力估计 python
- 门徒Disciples体系:致力于成为“DAO世界”中的集大成者。
- View 5应用之五:iPad与Android携带虚拟桌面
- 一个企业上线PLM系统前应该做些什么?杰信PLM
- css笔记 vertical-align详解
- php 票务系统开发_电子票务系统的意义和实现
- ARCore系列教程(1)---创建第一个原生AR应用