通过拦截器记录操作日志,将操作日志保存到数据库中,实现这个功能需要我们将curd操作的URL规范化,比如:新增是以add或者insert开始,修改是update开头,删除则是delete开头。
第一步:编写拦截器类,代码如下:
package com.siweisoft.interceptor;
import com.siweisoft.dao.OperationRecordMapper;
import com.siweisoft.model.OperationRecord;
import com.siweisoft.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* 操作日志的拦截器
* Created by Robin on 2017-08-08.
*/
public class OperationRecordInterceptor implements HandlerInterceptor{
protected static final Logger log = LoggerFactory.getLogger(OperationRecordInterceptor.class);
@Autowired
private OperationRecordMapper operationRecordMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 方法执行后拦截
* 用来记录所有请求中的操作日志
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//相对路径 /tongche/metadata/all
String url = request.getRequestURI();
//请求方式 POST
String method = request.getMethod();
String[] urlArray = url.split("/");
if(urlArray.length>3){
//判断是否是增加操作
if("add".equalsIgnoreCase(urlArray[3].substring(0,3))||("ins".equalsIgnoreCase(urlArray[3].substring(0,3)))&&("POST".equalsIgnoreCase(method))){
addOperation(request,"ADD",urlArray[2],0);
}
//判断是否是删除操作
if("del".equalsIgnoreCase(urlArray[3].substring(0,3))&&("POST".equalsIgnoreCase(method))){
//当前操作的对象的ID
int id = (int)request.getAttribute("id");
addOperation(request,"DELETE",urlArray[2],id);
}
//判断是否是修改操作
if("upd".equalsIgnoreCase(urlArray[3].substring(0,3))&&("POST".equalsIgnoreCase(method))){
addOperation(request,"UPDATE",urlArray[2],0);
}
}else{
log.info("不合法的URL:"+url);
}
}
/**
* 向操作日志中增加数据的方法
* @param request
* @param operate 操作
* @param operateObject 操作对象
*/
public void addOperation(HttpServletRequest request, String operate, String operateObject,int id){
//构造操作日志对象
OperationRecord operationRecord = new OperationRecord();
User user = (User) request.getSession().getAttribute("user");
operationRecord.setOperateObject(operateObject);
operationRecord.setOperate(operate);
operationRecord.setUserId(user.getId());
operationRecord.setOperateTime(new Date());
operationRecord.setOperateState(1);
if(id>0){
operationRecord.setOperateObjectKey(id);
}
operationRecordMapper.insertSelective(operationRecord);
log.info("添加操作日志成功!");
}
}
第二步:配置拦截器,代码如下:
<!--日志拦截器-->
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 需排除拦截的地址 -->
<mvc:exclude-mapping path="/login.jsp"/>
<!--<mvc:exclude-mapping path="/user/getUserInfo"/>-->
<mvc:exclude-mapping path="/user/pcLogin"/>
<bean class="com.siweisoft.interceptor.OperationRecordInterceptor"></bean>
</mvc:interceptor>
这样就可以把简单的curd的操作记录到数据库中。