SpringMVC 使用拦截器实现日志记录

SpringMVC 使用拦截器实现日志记录

java web日志实现方式有很多种,这次在这里介绍使用拦截器记录日志

  1. 拦截器代码

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);
   }
}
  1. 配置文件中加入连接器配置
<mvc:interceptor>
  	<mvc:mapping path="/service/**" />
  	<bean id="logInterceptor" class="com.my.interceptor.LogInterceptor" />
  </mvc:interceptor>
  1. 获取远程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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值