1、创建行为元注解
package com.lieni.am.mgmt.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 〈一句话功能简述〉<br>
* 声明需要记录操作日志
*
* @author xiangpeng
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Behavior {
/**
* 需要记录的参数名,不赋值表示所有参数
*/
String[] params() default {};
String[] excludeParams() default {};
}
2、线程池配置,properities文件就省略了
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="${threadpool.corePoolSize}" />
<property name="maxPoolSize" value="${threadpool.maxPoolSize}" />
<property name="queueCapacity" value="${threadpool.queueCapacity}" />
<property name="threadNamePrefix" value="custom_" />
</bean>
3、实现HandlerInterceptor接口创建拦截器
package com.lieni.am.mgmt.interceptor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.lieni.am.mgmt.annotation.Behavior;
import com.lieni.api.mgmt.remote.IBehaviorRemoteService;
import com.lieni.auth.bean.AuthSession;
import com.lieni.core.exception.NeedLoginException;
import com.lieni.core.util.HttpRequestUtil;
/**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author xiangpeng
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
@Component
public class BehaviorHandlerInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(BehaviorHandlerInterceptor.class);
@Autowired
private IBehaviorRemoteService behaviorRemoteService;
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
//执行controller方法后进入
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
//获取元注解配置的参数
Behavior behavior = handlerMethod.getMethodAnnotation(Behavior.class);
if (null == behavior) {
return;
}
final String url = request.getRequestURL().toString();
final String method = request.getMethod();
final String ip = HttpRequestUtil.getRemoteIp(request);
final String operatorId = getUserId(request);
if (StringUtils.isBlank(operatorId)) {
return;
}
final Map<String, String> paramMap = getParams(request, behavior);
//采用异步处理
taskExecutor.execute(new Runnable() {
@Override
public void run() {
//记录持久化,就是个insert,不多说了
behaviorRemoteService.addBehavior(operatorId, url, method, ip, paramMap);
}
});
}
}
private String getUserId(HttpServletRequest request) throws NeedLoginException {
AuthSession authSession = (AuthSession) request.getAttribute("authSession");
if (authSession == null) {
logger.error("authSession is null.");
return null;
}
// 已登录用户session中应该有用户id
if (StringUtils.isNoneBlank(authSession.getUserId())) {
return authSession.getUserId();
}
return null;
}
private Map<String, String> getParams(HttpServletRequest request, Behavior behavior) {
List<String> paramList = new ArrayList<String>();
String[] params = behavior.params();
String[] excludeParams = behavior.excludeParams();
if (params != null && params.length > 0) {
if (ArrayUtils.isNotEmpty(params)) {
for (String param : params) {
if (StringUtils.isNotEmpty(param)) {
paramList.add(param.trim());
}
}
}
}
if (CollectionUtils.isEmpty(paramList)) {
for (Object param : request.getParameterMap().keySet()) {
String paramString = String.valueOf(param);
if (!ArrayUtils.contains(excludeParams, paramString)) {
paramList.add(paramString);
}
}
}
Map<String, String> paramMap = new HashMap<String, String>();
for (String param : paramList) {
String value = request.getParameter(param);
if (value != null) {
paramMap.put(param, value);
}
}
return paramMap;
}
//执行controller方法前进入
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.lieni.am.mgmt.interceptor.BehaviorHandlerInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>