java利用拦截器记录用户的操作日志

java利用拦截器记录用户的操作日志-尅爱的小狗
尅爱的小狗
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

2020-10-14 23:10:37   356浏览 分类: Java

最近要做一个功能,就是要在用户登录进去就显示用户的操作日志,比如用户的登录退出修改等日志信息,以及用户对其他表的各种操作均需要记录在日志里。难道要在每个controller的方法里写一下么,那真实费时又费力,有没有简单的方法呢?

这里我就简单说说我自己是怎么做的,给大家提供一个思路吧。

首先新建一个日志表,专门用来记录日志数据,表格字段:登录用户id,操作描述,时间,用户请求的url

然后写一个拦截器,拦截器可以获取用户的所有请求,根据请求进行接口的描述,即用户的操作描述。

我的请求路径有一个规律即:表名/方法名

比如staff/login,staff表示员工表login表示登录操作;customer/saved ,customer表示客户,saved表示保存操作。

那么我需要写一个日志描述工具,根据url来进行用户操作的描述:
代码如下:
package com.gph.util;


/**
* logs工具类
*
* @author limpo
*
*/
public class LogsUtil {
public static String getMsg(String url) {
String msg="";
if(url.indexOf("staff")>-1){
msg+="员工表-";
/*staff*/
if(url.indexOf("checkAccount")>-1)msg+="账号检测";
if(url.indexOf("initpass")>-1)msg+="重置密码";
if(url.indexOf("login")>-1)msg+="登录";
if(url.indexOf("logout")>-1)msg+="退出";
if(url.indexOf("to_pwd")>-1)msg+="跳转修改个人密码的页面";
if(url.indexOf("tologin")>-1)msg+="跳转登录页面";
if(url.indexOf("up_pwd")>-1)msg+="保存个人密码";
if(url.indexOf("toindex")>-1)msg+="登录 :日志展示";
}
if(url.indexOf("customer")>-1){
msg+="客户表-";
/*customer*/
if(url.indexOf("checkTel")>-1)msg+="手机号检测";


}
if(url.indexOf("logs")>-1)msg+="日志表-";

if(url.indexOf("excel")>-1){
msg+="导出表格-";
if(url.indexOf("getCustomer")>-1)msg+="客户表";
}

/*通用方法名*/
if(url.indexOf("list")>-1)msg+="查看列表";
if(url.indexOf("toadd")>-1)msg+="跳转添加或者编辑页面";
if(url.indexOf("del")>-1)msg+="删除";
if(url.indexOf("saved")>-1)msg+="保存";
if(url.indexOf("toinfo")>-1)msg+="查看详情";

return msg;
}

}

接下来写拦截器,因为是后台管理系统,所以是在用户登录后来获取操作日志,代码如下:
 


public class LoginInterceptor implements HandlerInterceptor {

// 执行Handler方法之前执行
// 用于身份认证、身份授权
// 比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行

@Autowired
LogsService logsService;

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {

String url = request.getRequestURI();
System.out.println("拦截器======="+url);

Staff u = (Staff) request.getSession().getAttribute("loginU");

//不需要需要登录验证
String need_login_urls[]={"/staff/tologin","/staff/login","/staff/logout"};
for(String ul:need_login_urls){
if(url.indexOf(ul)>-1){
System.out.println("放行===");

return true;
}
}

if(u==null){
response.sendRedirect(request.getContextPath()+"/jsp/staff/tologin");
System.out.println("拦截===");
return false;
}
//此处是需要保存的日志逻辑
Logs l=new Logs();
l.setS_id(u==null?0:u.getS_id());
l.setUrl(url);
l.setMsg(LogsUtil.getMsg(url));
if(l.getMsg().trim().length()>0)logsService.add(l);



return true;

}



// 进入Handler方法之后,返回modelAndView之前执行
// 应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里
// 传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

}

// 执行Handler完成执行此方法
// 应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}

}
最终结果图:


数据库数据:


这样是不是就简单多了,不用在每个地方加日志逻辑。当然,如果嫌日志描述麻烦,也可以只存储路径,或者这代码里的方法命名都统一起来。

好文章就要一起分享哦!分享海报

此处可发布评论

评论(0

暂无评论,快来写一下吧
客服QQ 1913284695