AspectJ截获操作

package com.example.aspectjandroidtest;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import org.apache.http.util.EncodingUtils;

import com.facebook.crypto.Crypto;
import com.facebook.crypto.Entity;
import com.facebook.crypto.keychain.SharedPrefsBackedKeyChain;
import com.facebook.crypto.util.SystemNativeCryptoLibrary;

public aspect FileAspectJ {

	private boolean isEncryption = true;
	//使用秘钥链和原生库的默认实现,来创建一个新的加密对象
	Crypto crypto = new Crypto(
			new SharedPrefsBackedKeyChain(MainActivity.context),
			new SystemNativeCryptoLibrary());

	//创建应用文件的切点集合
	pointcut openFileOutput(String filename,int mode) : !within(FileAspectJ) && args(filename,mode) && call(* openFileOutput(..));
	after (String filename,int mode) returning : openFileOutput(filename, mode){
		//System.out.println("fx Aspectj openFile is start");
		byte[] buffer;
		try {
			System.out.println("fx Aspectj openFileName"+filename);
			buffer = filename.getBytes("UTF8");
			FileOutputStream fileOutputStream = null;
			try {
				//记录本应用加密过的文件
				fileOutputStream = MainActivity.context.openFileOutput("fileList",
						MainActivity.context.MODE_APPEND);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				fileOutputStream.write(buffer);
				fileOutputStream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	//读取应用文件的切点集合
		pointcut openFileInput(String filename) : !within(FileAspectJ) && args(filename) && call(* openFileInput(..));
		before(String filename) : openFileInput(filename){

			String result = "";
			try {
				FileInputStream fileInputStream = MainActivity.context.openFileInput("fileList");
				int bufferSize = 0;
				try {
					bufferSize = fileInputStream.available();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} // 取得输入流的字节长度
				byte buffer[] = new byte[bufferSize];
				try {
					fileInputStream.read(buffer);
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				result = EncodingUtils.getString(buffer, "UTF-8");
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//判断文件是否加密过
			if(result.indexOf(filename) == -1){
				isEncryption = false;//未加密
				System.out.println("fx 文件未加密");
			}else{
				isEncryption = true;//已加密
				System.out.println("fx 文件已加密");
			}
		}

		//截获到File的new操作
		pointcut filePointcut(String pathname ) :  !within(FileAspectJ) && args(pathname) && call(java.io.File.new(..));
		before(String pathname ) : filePointcut(pathname) {
			System.out.println("fx pathname is " + pathname);
		}

	//写文件切点的集合
	pointcut writePointcut(FileOutputStream fileStream, byte[] buffer) : !within(FileAspectJ) && target(fileStream)&& args(buffer) && call(* write(..));
	void around(FileOutputStream fileStream, byte[] buffer) : writePointcut(fileStream, buffer) {
		System.out.println("fx Aspectj write is start");
		//检查加密功能是否可用
		//如果Android没有正确载入库,则此步骤可能失败
		if (!crypto.isAvailable()) {
			System.out.println("return error");
			return;
		}
		OutputStream fbFileStream = new BufferedOutputStream(fileStream);
		try {
			//创建输出流,当数据写入流的时候进行加密,并将加密后的数据输出到文件
			OutputStream outputStream = crypto.getCipherOutputStream(
					fbFileStream, new Entity("test"));
			outputStream.write(buffer);
			outputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//读文件切点集合
	pointcut readPointcut(FileInputStream fileStream, byte[] buffer) : !within(FileAspectJ) && target(fileStream)&& args(buffer) && call(* read(..));
	int around(FileInputStream fileStream, byte[] buffer) : readPointcut(fileStream, buffer) {
		System.out.println("fx Aspectj read is start");
		int bufferSize = 0;
		if(isEncryption==false){
			return 0;
		}
		try {
			//文件流解密操作
			InputStream inputStream = crypto.getCipherInputStream(fileStream,	new Entity("test"));
			bufferSize = inputStream.available(); // 取得输入流的字节长度
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	        byte[] data = new byte[1024];
			int len;
			 if (inputStream != null) {
		            try {
		                while ((len = inputStream.read(data)) != -1) {
		                    outputStream.write(data, 0, len);
		                }
		                data = outputStream.toByteArray();
		            } catch (IOException e) {
		            }
		        }
			 for(int i = 0;i<data.length;i++) {
				 buffer[i] = data[i];
			 }
			inputStream.close();
			outputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return bufferSize;
	}

}
时间: 2024-09-28 20:19:26

AspectJ截获操作的相关文章

虚拟化技术基础

摘要 虚拟化是云计算系统中的一种基础技术,可以说当前一个云计算服务必定是构建在虚拟化的基础上的.本文首先介绍了不同抽象层次的虚拟化技术,之后对应用广泛的系统级虚拟化和操作系统级虚拟化进行了更详细的分类和描述,最后介绍了各种典型虚拟化方案的具体实现. 虚拟化技术简介 首先,什么是计算机?现在使用的计算机都离不开冯诺依曼体系结构,如图1所示,有输入设备.输出设备.存储器.cpu这就算是完整的计算机硬件环境了(当然还需要网卡.显卡等等).虚拟化技术就是在一台机器上模拟出独立的cpu.存储器等使得同一台

基于aspectj实现AOP操作的两种方式——xml配置

1. 要导入的 jar 包: 常用的aspectj表达式: 权限修饰符可以省略,以下表示:返回值类型为任意,com.chy.service包以及其子包下的.任意类的.参数任意的.任意方法 execution(* com.chy.service..*(..) 2. 在spring的核心配置文件中: 总结: 1. 配置切入点 2. 配置切面:把哪个增强类的哪个方法,前置增强到哪个切入点上 原文地址:https://www.cnblogs.com/cn-chy-com/p/9256048.html

基于aspectj的aop注解操作

Android基于AOP的非侵入式监控之——AspectJ实战

一引言 二什么是AspectJ 1 它只是一个代码编译器 2 它是用来做AOP编程的 3为什么要用AspectJ 三AspectJ原理与运用 1 基本原理 2 使用方式 21 纯注解方式 22 AspectJ语言 23 结合自定义注解使用 四AspectJ实战监听方法执行耗时打印并输出 五一些比较常见的问题 六推荐文章 一.引言 本博文的目的不是详细的介绍AspectJ的细节,而是最近项目用到了AspectJ,因此对其作了一些使用和重要概念上的总结. 相信很多做过Web的同学对AspectJ都不

spring事物管理--声明式(AspectJ)(推荐使用)

1.表结构及数据 2.需引入的jar包: 3.业务层(Service).持久层(Dao)接口与实现类 Service接口: //转账案例业务层接口 public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money :转账金额 */ public void transfer(String out,String in,Double money); } Service实现类: //转账案例

Qt中如何禁掉所有UI操作以及注意事项(处理各个widget的eventFilter这一层,但是感觉不好,为什么不使用QApplication呢)

刚做完的一个项目,在测试时出现了一个问题:由于多线程的存在,当进行语音识别时:如果用户点击程序界面上的button或者其他接受点击事件后会发出信号的widget时,程序会crash ! 后来尝试着从多线程上去解决,但是比较困难:后来只能从另外一条路来解决,那就是:当语音识别进行时:禁掉一切用户操作! 所谓的禁掉一切UI操作,在手机等手持设备上,尤其是纯触摸屏的设备上,主要就是指的禁止mouse操作!当然了:也可能是禁止键盘操作等.那如何去做这一点呢? 方法:我们可以截获禁止操作的窗口的所有eve

《Linux Device Drivers》第六章 高级字符驱动程序操作——note

ioctl 支持的操作,例如 简单数据传输 控制动作,例如用户空间发起弹出介质动作 反馈硬件的状态,例如报告错误信息 参数配置,例如改变波特率 执行自破坏 用户空间的ioctl方法原型:int ioctl(int fd, unsigned long cmd, -);每个ioctl命令就是一个独立的系统调用,而且是非公开的 驱动程序的ioctl方法原型:int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, u

AspectJ学习笔记2-Eclipse中AspectJ插件AJDT的正确安装方法

接着之前一篇日志.这个事情也挺无语的,简单记录一下. 在这里:http://www.eclipse.org/ajdt/ 可以下载最新的Eclipse Plugin,下载解压之后,一般来说,直接把解压后文件夹下的features和plugins放到Eclipse的文件夹下就行了.不过我这样做以后,启动Eclipse,发现没什么作用.才参考网上有人介绍的第二种方法,也就是Help--Install New Software--Add--Local这种方式选择刚才的解压文件夹,但是这样操作以后会报像下

深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good

之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时候工作正常,但是有时候会出现不提醒现象.我想这中间是不是有什么玄机,Windows的关机方案从XP到Win7到底发生了什么变化,如何进行有效的截获Windows关机消息.对此,我搜寻了MSDN和网上论坛结合自己的测评给出一个完善的描述和解决方案,如果你有类似的需求,可以参考这篇文章. 在MSDN中对