直接上代码:
@Component
public class Interceptor implements HadlerInterceptor{
@Autwired
//操作日志service
private static service;
public @PostConstruct void init(){service =操作日志service }
一.访问controller方法前执行拦截
public boolean preHandle (HttpservletRequset request ,HttpServletResponse response,Object bij)throes Exception{
//查询请求方法是否有注解,,没有不拦截,
String[] getValue = {"查询","搜索","接收"};
String[] addValue ={"新增"};
String[] updateValue ={"更新","修改"};
String[] deleteValue ={"删除"};
if(obj instanceof HandlerMethod){
HandlerMethod hand = (HandlerMethod )obj;
LogAnnotation auditLog = hand.getMethod.getAnnottation(LogAnnotation.class);
ApiOperation operaLog = hand.getMethod.getAnnottation(ApiOperation.class);
if(auditLog != null && auditLog .ignore() == true){
log.info("访问方法无需拦截");
reture true;
}else{
String value = '';
String body = '';
StringBuffer url = requst.getRequestURL();
String path = request.getServletPath();
String ip = this.getIP(request);
String method = requset.getMethod();
if("GET".equals(method)){
value= "查询";
}else{
if(operaLog != null){
value = operaLog.value();
if(StringUtils.isNotBlank(value)){
if(value.length() > 4){
if(containsWords(value,getValue)){
value = "查询";
}
if(containsWords(value,addValue){
value = "新增";
}
if(containsWords(value,updateValue){
value = "修改";
}
if(containsWords(value,deleteValue){
value = "删除";
}
}
}else{
value= method;
}
}
}
if(StringUtils.isBlank(value) || value.length() > 4){
value= method;
}
log.info(new Date() + "--preHandle:" + url);
int status = response.getStatus();
if(status != 200){
//调用service添加接口,添加失败操作日志
service.addAuditLog(path,value,"失败",body,ip);
return true;
}
if(request instanceof XXSRequestWrapper){
XXSRequestWrapper wrapper = (XXSRequestWrapper)request;
body = wrapper.getBody();
}
service.addAuditLog(path,value,"成功",body,ip);
return true;
}
}else if(handler instanceof ResourceHttpRequestHandler){
return true;
}
return false;
}
二.访问controller方法后执行
public void postHandle(HttpservletRequset request ,HttpServletResponse response,Object bij,ModelAndView view)
int status = response.getstatus();
if(status != 200){
SreAuditLog auditLog = service.queryNewLog();
auditLog.setActionResult("失败");
service.update(auditLog);
}
三.获取ip
private String getIp(HttpservletRequest request){
List<String> ip = Stream.of("X-Forwarded-For","Proxy-Client-Ip","WL-Proxy-Client-Ip","HTTP_CLIENT_IP","X-Real-Ip").collect(Collectors.toList());
for(String ipHead : ip){
if(chackIP(request.getHeader(iphead))){
return request.getHeader(iphead).split(",")[0];
}
}
return "0:0:0:0:0:0:0:1".equals(request.getRemoteAddr()) ? "127.0.0.1" : request.getRemoteAddr();
}
//检查IP存在
private boolean chackIP(String ip){
return !(null == ip || ip.length() }} "unknown".equalsIgnoreCase(ip));
}
}
补充:自定义注解:
@Target(ElementTpye.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation{
String name() default "";
String action() default "";
String ignore() default "";
}
数据库表:
主键id,创建时间,userName,ip,action_type,action_obj, action_result,action_detail,邮箱