最近这两周都在做一个日志管理的模块,在别人搭好的spring-springMVC-mybatis框架下实现系统操作日志入库并显示的功能。
心路历程:最先想到的是原始办法,用jdbc连接数据库,在每个controller里的每个方法都调用一次插入数据库方法,想想就非常复杂,而且添加一个方法就要再添加一个入库操作,于是放弃了;然后在网上搜日志管理模块,发现很多人都用SpringAOP注解来做,AOP(横向切面编程),听起来非常高大上有没有,然而非常不适合像我一样的菜鸟新手;想了好几天,终于让我想到了一个非常简单易操作的方法,用springMVC自带的拦截器拦截请求,解析并插入数据库。
因为每个方法在调用的时候都会经过springMVC的拦截器,只需要解析每个方法的url,然后采用字符串拼接就OK了,是不是非常非常非常简单,可把我给厉害坏了,叉会腰。
@Override
public boolean preHandle(final HttpServletRequest request,
HttpServletResponse response, Object handler){
JSONObject requestBody = new JSONObject();
JSONObject params = new JSONObject();
JSONObject headers = new JSONObject();
Enumeration<String> em = request.getHeaderNames();
while (em.hasMoreElements()) {
String s = em.nextElement();
headers.put(s, request.getHeader(s));
}
requestBody.put("headers", headers);
Enumeration<String> pem = request.getParameterNames();
while (pem.hasMoreElements()) {
String s = pem.nextElement();
headers.put(s, request.getParameter(s));
}
String path = request.getServletPath();
LogForm log = new LogForm();
String content = requestBody.toJSONString();
log.setLog_operation(request.getRequestURI());
log.setLogin_username("用户名");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.setCreatetime(df.format(System.currentTimeMillis()));//获取当前时间插入数据库
String requestUrl = request.getRequestURI();
logService.insertLog(log);
if(uncheckUrls.contains(requestUrl)){
return true;
}
if(request.getSession().getAttribute("user") == null && !path.contains("login.do")){
try {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
StringBuffer sb = new StringBuffer();
sb.append("<script type='text/javascript'>");
sb.append("alert('请重新登录!!!');");
sb.append("window.location.href ='**'");
sb.append("</script>");
response.getWriter().print(sb.toString());
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}else{
return true;
}
}