www.ifueen.com:私の個人的なブログへようこそ!
前にやったことがないので、何かをしようとし、情報へのアクセスをオンラインに行く、その後、バックグラウンドシステムログ機能を行うための最近のJavaが必要
一般的な考え方:
前コントローラ部によるAOP、新しいカスタム注釈を作成し、AOPモジュールの内部に配置されたが、完全に提供し、機能現在の操作をした後、エンティティクラスにログを設定し、最後には、データベースに保存されます
まず、カスタム注釈:
package com.sure.crm.web.config;
import java.lang.annotation.*;
/**
* 系统日志的自定义注解
*
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {
String module() default "";
String methods() default "";
}
次に、設定するには、自分の状況に応じてAOP
pom.xmlに依存関係を紹介
<!--aop的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--切面的一个包(织入)-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
ApplicationContextの-MVCでの構成で
<!-- aop配置 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 扫描包支持 -->
<bean id="aopLogConfig" class="com.sure.crm.web.config.AopLogConfig">
</bean>
そして、ここではコントローラ上の書き込みAOPの設定クラスは、ログ保存、それをカット
package com.sure.crm.web.config;
import com.sure.crm.domain.Employee;
import com.sure.crm.domain.LogEntity;
import com.sure.crm.service.LogService;
import com.sure.shiro.UserContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Aop日志的配置
*
*/
@Component
@Aspect
public class AopLogConfig {
//注入service,用来将日志信息保存在数据库
@Autowired
private LogService logservice;
//配置接入点
@Pointcut("execution(* com.sure.crm.web.controller..*.*(..))")
private void controllerAspect(){}//定义一个切入点
@Around("controllerAspect()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//日志实体对象
LogEntity log = new LogEntity();
//获取登录用户账户
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//拿到当前用户,我是通过shiro的主体来取的,各自根据各自情况来进行设置
Employee user = UserContext.getUser();
if (null != user){
//设置当前用户名
String name = user.getName();
log.setUSERID(name);
}
//获取系统时间
String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
log.setDATA(time);
//获取客户端ip
String ip = request.getRemoteAddr();
log.setIP(ip);
//方法通知前获取时间,来计算模块执行时间的
long start = System.currentTimeMillis();
// 拦截的实体类,就是当前正在执行的controller
Object target = pjp.getTarget();
// 拦截的方法名称,当前正在执行的方法
String methodName = pjp.getSignature().getName();
// 拦截的方法参数
Object[] args = pjp.getArgs();
// 拦截的放参数类型
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Class[] parameterTypes = msig.getMethod().getParameterTypes();
Object object = null;
// 获得被拦截的方法
Method method = null;
try {
method = target.getClass().getMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(method);
if (null != method) {
// 判断是否包含自定义的注解,说明一下这里的SystemLog就是我自己自定义的注解
if (method.isAnnotationPresent(SystemLog.class)) {
SystemLog systemlog = method.getAnnotation(SystemLog.class);
log.setMODULE(systemlog.module());
log.setMETHOD(systemlog.methods());
try {
object = pjp.proceed();
long end = System.currentTimeMillis();
//将计算好的时间保存在实体中
log.setRSPONSE_DATA(""+(end-start));
log.setCOMMITE("执行成功!");
//保存进数据库
logservice.save(log);
/*System.out.println("没切完");*/
} catch (Throwable e) {
// TODO Auto-generated catch block
long end = System.currentTimeMillis();
log.setRSPONSE_DATA(""+(end-start));
log.setCOMMITE("执行失败");
logservice.save(log);
/*System.out.println("切切切");*/
}
} else {//没有包含注解
object = pjp.proceed();
}
} else { //不需要拦截直接执行
object = pjp.proceed();
}
/*System.out.println("切完了");*/
return object;
}
}
ログ情報を格納するために使用される新しいデータベース・テーブル、次の構造
もちろん、この方法はまた、内のエンティティクラス1アップそれに書かれたデータベーステーブルをドメインクラスを必要とし、その後、CRUDを書きます
ビューコントローラクラス最後の世代のログに
package com.sure.crm.web.controller;
import com.sure.AjaxResult;
import com.sure.PageList;
import com.sure.crm.domain.LogEntity;
import com.sure.crm.query.LogEntityQuery;
import com.sure.crm.service.LogService;
import com.sure.crm.web.config.SystemLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 配置系统日志的Controller
*/
@CrossOrigin
@Controller
@RequestMapping("/log")
public class AopLogController {
@Autowired
private LogService logService;
@ResponseBody
@RequestMapping(value = "/queryPage",method = RequestMethod.PATCH)
@SystemLog(module = "系统日志",methods = "日志管理-查询日志")
public PageList<LogEntity> findLog(@RequestBody LogEntityQuery query){
//这是我自己封装的一个类,一般不需要,根据各自情况来设置返回值
PageList<LogEntity> pageList = logService.queryPage(query);
return pageList;
}
}
そして、フロントページへのアクセス要求に、完全にアウトデータを示すテーブルを介して、