CUBA里面利用Spring Aop基于注释进行日志管理时,怎样对web模块中的方法进行拦截??
目前可以利用Spring Aop 对Service进行拦截
我目前的设计思路是:
1.自定义注释
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAnno {
String operateAction(); // 记录日志的操作动作:查询、登录、下载、浏览、抽取、审核等信息
String operatePage(); //记录日志的操作页面
// String downData(); //记录日志的数据下载量
}
2、创建切面
package com.company.testaop.aop;
@Component(NAME)
@Aspect
public class LogAspect {
public static final String NAME = "logAopAspect";
@Around("@annotation(cn.com.dataocean.khsqsg.annotions.LogAnno)")
public Object aroundLogAnno(ProceedingJoinPoint pjp) throws Throwable{
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
// 获取方法
Method method = methodSignature.getMethod();
// 获取方法上面的注解
LogAnno logAnno = method.getAnnotation(LogAnno.class);
//获得用户在系统中的 操作动作 信息
String operateAction = method.getAnnotation(logAnno.getClass()).operateAction();
//获得用户在系统中的 操作页面 信息
String operatePage = method.getAnnotation(logAnno.getClass()).operatePage();
获得用户在系统中的 数据下载量 信息
String downData = method.getAnnotation(logAnno.getClass()).downData();
获取操作动作的值
String operateAction = logAnno.operateAction();
String operatePage = logAnno.operatePage();
创建一个日志对象(准备记录日志)
UserDetail userDetail = new UserDetail();
userDetail.setActions(operateAction);
userDetail.setPage(operatePage);
获取session中的user对象进而获取操作人名字
User user = (User) khsqsg_TestService.getRequest().getSession().getAttribute("userinfo");
Object result = null;
try {
让代理方法执行
String d = "判断进入了切面没有";
result = pjp.proceed();
2.相当于后置通知(方法成功执行之后走这里)
userDetail.setEmpName("正常");// 设置操作结果
} catch (SQLException e) {
3.相当于异常通知部分
userDetail.setEmpName("失败");// 设置操作结果
} finally {
4.相当于最终通知
userDetail.getActionDate(new Date());
userDetail.setOperatedate(new Date());// 设置操作日期
TestService.addLog(userDetail);// 添加日志记录
}
return result;
}
}
3、在Service中进行注释
package com.company.testaop.service;
@Service(TestService.NAME)
public class TestServiceBean implements TestService {
@Inject
private Logtable logtable;
private final static Logger log = getLogger(TestServiceBean.class);
@Override
public void crateTable() {
String age = "不说话";
}
@Override
@LogAnno(operateType = "输出信息")
public boolean addLog(Logtable log) throws SQLException {
String insetSql = "222222222";
return true;
}
}
4、我如果想在web层里面进行注释该怎么实现呢?
package com.company.testaop.web.logtable;
import com.company.testaop.annotation.LogAnno;
import com.company.testaop.service.TestService;
import com.haulmont.cuba.gui.components.AbstractLookup;
import com.haulmont.cuba.gui.components.Component;
import javax.inject.Inject;
public class LogtableBrowse extends AbstractLookup {
@Inject
private TestService testService;
@LogAnno(operateType = "注释信息")
public void onCreate(Component source) {
testService.crateTable();
}
}