SpringMVC 使用拦截器实现日志记录
java web日志实现方式有很多种,这次在这里介绍使用拦截器记录日志
- 拦截器代码
package com.my.interceptor;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.my.service.AdminService;
import com.my.service.LogService;
import com.my.utils.WebUtils;
/**
* Interceptor - 日志
*/
public class LogInterceptor extends HandlerInterceptorAdapter {
/** 默认忽略参数 */
private static final String[] DEFAULT_IGNORE_PARAMETERS = new String[] { "password", "rePassword", "currentPassword" };
/** antPathMatcher */
private static AntPathMatcher antPathMatcher = new AntPathMatcher();
/** 忽略参数 */
private String[] ignoreParameters = DEFAULT_IGNORE_PARAMETERS;
@Autowired
private LogService logService;
@Autowired
private AdminService adminService;
/**
* 该方法将在请求处理之前进行调用
* @param request 请求
* @param response 响应
* @param handler 操作
* @return true继续进入下一个拦截器的preHandle方法或者进入对应的Controller方法,false终止请求
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return super.preHandle(request, response, handler);
}
/**
* 在调用Controller方法后,在DispatcherServlet 进行视图返回渲染视图前进行调用
* @param request 请求
* @param response 响应
* @param handler 操作
* @param modelAndView 视图
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
String path = request.getServletPath();
//当前登录用户名
String operator = adminService.getLoginedName();
//获取用户IP
String ip = WebUtils.getRemoteIp(request);
StringBuffer parameter = new StringBuffer();
Map<String, String[]> parameterMap = request.getParameterMap();
if (parameterMap != null) {
for (Entry<String, String[]> entry : parameterMap.entrySet()) {
String parameterName = entry.getKey();
if (!ArrayUtils.contains(ignoreParameters, parameterName)) {
String[] parameterValues = entry.getValue();
if (parameterValues != null) {
for (String parameterValue : parameterValues) {
parameter.append(parameterName + " = " + parameterValue + "\n");
}
}
}
}
}
Log log = new Log();
log.setParameter(parameter.toString());
log.setOperator(operator);
log.setIp(ip);
logService.save(log);
}
/**
* 在视图渲染后调用
* @param request 请求
* @param response 响应
* @param handler 操作
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
- 配置文件中加入连接器配置
<mvc:interceptor>
<mvc:mapping path="/service/**" />
<bean id="logInterceptor" class="com.my.interceptor.LogInterceptor" />
</mvc:interceptor>
- 获取远程IP地址
/**
* 获取远程网协地址
*
* @param request HttpServletRequest
* @return 远程网协地址
*/
public static String getRemoteIp(HttpServletRequest request) {
if (request == null) {
return null;
}
String remoteIp = request.getHeader("x-forwarded-for");
if (StringUtils.isBlank(remoteIp) || StringUtils.equalsIgnoreCase(remoteIp, "unknown")) {
remoteIp = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(remoteIp) || StringUtils.equalsIgnoreCase(remoteIp, "unknown")) {
remoteIp = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(remoteIp) || StringUtils.equalsIgnoreCase(remoteIp, "unknown")) {
remoteIp = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(remoteIp) || StringUtils.equalsIgnoreCase(remoteIp, "unknown")) {
remoteIp = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(remoteIp) || StringUtils.equalsIgnoreCase(remoteIp, "unknown")) {
remoteIp = request.getRemoteAddr();
}
return remoteIp;
}