使用Spring MVC攔截器管理操作日誌
阿新 • • 發佈:2019-01-31
通過攔截器記錄操作日誌,將操作日誌儲存到資料庫中,實現這個功能需要我們將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的操作記錄到資料庫中。