记录日志这个在每个系统都会必须会用到的功能,实现方案也是非常多
我列出使用Struts2的拦截器拦截action的方式来实现业务日志的记录
自定义Interceptor的代码如下:
package com.test;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.zbxsoft.flow.web.FlowDeployeAction;
import com.zbxsoft.flow.web.FlowHisActivityAction;
/**
* 日志拦截器
* <p>
* 通过继承Struts2的AbstractInterceptor实现日志
* </p>
* @author 流浪鱼
*/
public class LogInterceptor extends AbstractInterceptor {
private String logName;
private String logContent;
@Override
public String intercept(ActionInvocation ai) throws Exception {
//取到session
Map<String, Object> session = ai.getInvocationContext() .getSession();
//访问的Action类
Object action = ai.getAction();
//访问Action的方法
String method = ai.getProxy().getMethod();
//ai.invoke();// 执行被拦截action
//流程定义日志
if (action instanceof FlowDeployeAction) {
if(method.equals("data")){
logName = "流程定义列表";
logContent = "显示流程定义列表";
//logManager.saveLog(projectId,logName,logContent); 保存到数据库
}
if(method.equals("delete")){
logName = "流程定义删除";
//ai.getStack().findValue("deploymentId")可以取到action里边的参数值
logContent = "删除ID为:"+ai.getStack().findValue("deploymentId")+"的流程定义";
}
}
//流程活动历史日志
if (action instanceof FlowHisActivityAction) {
if(method.equals("data")){
logName = "流程活动历史节点";
logContent = "显示流程活动节点历史数据";
//logManager.saveLog(projectId,logName,logContent); 保存到数据库
}
}
System.out.println("===============================进入LogInterceptor Start===================");
System.out.println("访问的Action为"+action+" 对应方法为:"+method);
System.out.println(logName +" "+logContent);
System.out.println("===============================进入LogInterceptor End===================");
if(session.get("user")!=null){
return Action.INPUT;
}else{
return ai.invoke();// 执行被拦截action;
}
}
}
struts2的配置自定义的拦截器代码如下:
<interceptors> <!-- 自定义日志拦截器 --> <interceptor name="log" class="com.test.LogInterceptor" /> <interceptor-stack name="crudStack"> <interceptor-ref name="store"> <param name="operationMode">AUTOMATIC</param> </interceptor-ref> <interceptor-ref name="paramsPrepareParamsStack" /> <interceptor-ref name="log"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="crudStack" />