java通过filter实现操作日志入库的实现

java Web工程实现操作日志记录的方式有很多,比如通过spring aop方式实现,也可以通过Filter方式实现。

public class StoreLogFilter implements Filter {
	private static final Logger logger = LoggerFactory.getLogger(StoreLogFilter.class);
	private static Map<String, String> logRelation = new HashMap<String, String>();// 存放请求URL对应的日志类型和操作说明

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 从配置文件获取配置ip
		String path = "logRelation.properties";
		Properties prop = new Properties();
		try {
			InputStreamReader ins = new InputStreamReader(
					StoreLogFilter.class.getClassLoader().getResourceAsStream(path), "UTF-8");
			prop.load(ins);
			Enumeration keyNames = prop.keys();
			while (keyNames.hasMoreElements()) {
				String key = (String) keyNames.nextElement();
				if (StringUtils.isNotBlank(key)) {
					String value = prop.getProperty(key);
					logRelation.put(key, value);
				}
			}
		} catch (Exception e) {
			logger.error("init logRelation error," + e.getMessage());
		}
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest httpServletRequest;
		try {
			MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse) response);
			chain.doFilter(request, responseWrapper);
			if (request instanceof HttpServletRequest) {
				httpServletRequest = (HttpServletRequest) request;
				String userName = CommonUtils.getUserName(httpServletRequest);
				String pathInfo = httpServletRequest.getPathInfo();
				pathInfo = pathInfo.substring(1, pathInfo.length());
				//http://localhost:8080/Coolmart/login/login
				String url = httpServletRequest.getRequestURI().toString();
				if(url.contains("/login/login")){
					userName = httpServletRequest.getParameter("account");
				}
				if (logRelation.get(pathInfo) != null && StringUtils.isNotBlank(userName)) {
					// 记录日志
					insertLog(responseWrapper, httpServletRequest, userName, pathInfo);
				}
			}
		} catch (Exception e) {
			String errorMsg = new StringBuilder().append("write log to database error,").append(e.getMessage())
					.toString();
			logger.error(errorMsg);
		} finally {
		}
	}

	@Override
	public void destroy() {

	}

	/**
	 * 记录日志
	 * 
	 * @param responseWrapper
	 * @param httpServletRequest
	 * @param userName
	 * @param pathInfo
	 */
	private void insertLog(MyResponseWrapper responseWrapper, HttpServletRequest httpServletRequest, String userName,
			String pathInfo) {
		MyWriter myWriter = responseWrapper.getMyWriter();
		String returnMsg = "";
		if (myWriter != null) {
			returnMsg = myWriter.getContent();
		}
		String ip = CommonUtils.getRequestIp(httpServletRequest);
		String param = CommonUtils.getParam(httpServletRequest);
		String value = logRelation.get(pathInfo);
		String[] values = value.split(",");
		String action = values[0];
		int type = Integer.parseInt(values[1]);
		// 根据返回的rtnCode值判断执行结果(0正常,1异常)
		int result = getProcessResult(returnMsg);
		String requestUrl = String.valueOf(httpServletRequest.getRequestURL());
		// 开始记录日志
		StoreService.getInstance().insertLog(userName, ip, param, action, type, result, returnMsg,requestUrl);
	}

	/**
	 * 根据返回的rtnCode值判断执行结果
	 * 
	 * @param returnMsg
	 * @return
	 */
	private int getProcessResult(String returnMsg) {
		if (StringUtils.isNotBlank(returnMsg)) {
			String code = String.valueOf(JSONObject.fromObject(returnMsg).get("rtnCode"));
			if (code.equalsIgnoreCase("null") || code.equals("0") || code.equals("000")) {
				return 0;
			} else {
				return 1;
			}
		}
		return 0;
	}
}
工具类:CommonUtils

public class CommonUtils {
	/**
	 * 获取请求ip
	 * 
	 * @param request
	 * @return
	 */
	public static String getRequestIp(HttpServletRequest request) {
		String ip = request.getHeader("X-Forwarded-For");
		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			// 多次反向代理后会有多个ip值,第一个ip才是真实ip
			int index = ip.indexOf(",");
			if (index != -1) {
				return ip.substring(0, index);
			} else {
				return ip;
			}
		}
		ip = request.getHeader("X-Real-IP");
		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			return ip;
		}
		ip = request.getRemoteAddr();
		return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
	}

	/**
	 * 获取请求参数,以json字符串形式返回
	 * 
	 * @param request
	 * @return
	 * @throws JsonProcessingException
	 */
	public static String getParam(HttpServletRequest request) {
		Map<String, String> params = getParamKv(request);
		return JSONObject.fromObject(params).toString();
	}

	/**
	 * 获取请求参数,以map形式返回
	 * 
	 * @param request
	 * @return
	 */
	public static Map<String, String> getParamKv(HttpServletRequest request) {
		Map<String, String> map = new HashMap<String, String>();
		Enumeration paramNames = request.getParameterNames();
		while (paramNames.hasMoreElements()) {
			String paramName = (String) paramNames.nextElement();
			String[] paramValues = request.getParameterValues(paramName);
			if (paramValues.length == 1) {
				String paramValue = paramValues[0];
				if (paramValue.length() != 0) {
					map.put(paramName, paramValue);
				}
			}
		}
		return map;
	}

	/**
	 * 获取用户名
	 * 
	 * @param request
	 * @return
	 */
	public static String getUserName(HttpServletRequest request) {
		HttpSession session = request.getSession();
		Object userNameObj = session.getAttribute(Constants.SS_ACCOUNT);
		String userName = "";
		if (userNameObj != null) {
			userName = (String) userNameObj;
		}
		return userName;
	}
}



  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值