当前位置: 首页 > news >正文

乔柘云智能建站做网站建设的合同范本

乔柘云智能建站,做网站建设的合同范本,做一元购网站,网站制作建设兴田德SpringBoot项目如何优雅的实现操作日志记录 前言 在实际开发当中#xff0c;对于某些关键业务#xff0c;我们通常需要记录该操作的内容#xff0c;一个操作调一次记录方法#xff0c;每次还得去收集参数等等#xff0c;会造成大量代码重复。 我们希望代码中只有业务相关…SpringBoot项目如何优雅的实现操作日志记录 前言 在实际开发当中对于某些关键业务我们通常需要记录该操作的内容一个操作调一次记录方法每次还得去收集参数等等会造成大量代码重复。 我们希望代码中只有业务相关的操作在项目中使用注解来完成此项功能。 通常就是使用Spring中的AOP特性来实现的那么在SpringBoot项目当中应该如何来实现呢 一、AOP是什么 AOP(Aspect-Oriented Programming:⾯向切⾯编程)说起AOP几乎学过Spring框架的人都知道它是Spring的三大核心思想之一IOC控制反转DI依赖注入AOP面向切面编程。能够将那些与业务⽆关却为业务模块所共同调⽤的逻辑或责任例如事务处理、⽇志管理、权限控制等封装起来便于减少系统的重复代码降低模块间的耦合度并有利于未来的可拓展性和可维护性。 二、AOP做了什么 简单说来AOP主要做三件事 1、在哪里切入也就是日志记录等非业务代码在哪些业务代码中执行。2、在什么时候切入是在业务代码执行前还是后。3、切入后做什么事情比如权限校验日志记录等。 可以用一张图来理解 图上的一个核心术语的说明 Pointcut切点决定在何处切入业务代码中即织入切面。切点分为execution方式和annotation方式。execution方式可以用路径表达式指定哪些类织入切面annotation方式可以指定被哪些注解修饰的代码织入切面。Advice处理包括处理时机和处理内容。处理内容就是要做什么事比如校验权限和记录日志。处理时机就是在什么时机执行处理内容分为前置处理即业务代码执行前、后置处理业务代码执行后等。Aspect切面即Pointcut和Advice。Joint point连接点是程序执行的一个点。例如一个方法的执行或者一个异常的处理。在 Spring AOP 中一个连接点总是代表一个方法执行。Weaving织入就是通过动态代理在目标对象方法中执行处理内容的过程。 三、实现步骤 1自定义一个注解Log 2创建一个切面类切点设置为拦截标注Log的方法截取传参进行日志记录 3将Log标注在接口上 具体的实现步骤如下 1. 添加AOP依赖 代码如下示例 java复制代码 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency2. 自定义一个日志注解 日志一般使用的是注解类型的切点表达式我们先创建一个日志注解当spring容器扫描到有此注解的方法就会进行增强。代码如下示例 java复制代码 Target({ ElementType.PARAMETER, ElementType.METHOD }) // 注解放置的目标位置,PARAMETER: 可用在参数上 METHOD可用在方法级别上 Retention(RetentionPolicy.RUNTIME) // 指明修饰的注解的生存周期 RUNTIME运行级别保留 Documented public interface Log {/*** 模块*/String title() default ;/*** 功能*/public BusinessType businessType() default BusinessType.OTHER;/*** 是否保存请求的参数*/public boolean isSaveRequestData() default true;/*** 是否保存响应的参数*/public boolean isSaveResponseData() default true; }3. 切面声明 申明一个切面类并交给Spring容器管理。代码如下示例 java复制代码 Aspect Component Slf4j public class LogAspect {Autowiredprivate IXlOperLogService operLogService;/*** 处理完请求后执行* param joinPoint 切点*/AfterReturning(pointcut annotation(controllerLog), returning jsonResult)public void doAfterReturnibng(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {handleLog(joinPoint, controllerLog, null, jsonResult);}protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {try {// 获取当前的用户JwtUser loginUser SecurityUtils.getLoginUser();// 日志记录XlOperLog operLog new XlOperLog();operLog.setStatus(0);// 请求的IP地址String iP ServletUtil.getClientIP(ServletUtils.getRequest());if (0:0:0:0:0:0:0:1.equals(iP)) {iP 127.0.0.1;}operLog.setOperIp(iP);operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());if (loginUser ! null) {operLog.setOperName(loginUser.getUsername());}if (e ! null) {operLog.setStatus(1);operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));}// 设置方法名称String className joinPoint.getTarget().getClass().getName();String methodName joinPoint.getSignature().getName();operLog.setMethod(className . methodName ());operLog.setRequestMethod(ServletUtils.getRequest().getMethod());operLog.setOperTime(new Date());// 处理设置注解上的参数getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);// 保存数据库operLogService.save(operLog);} catch (Exception exp) {log.error(异常信息:{}, exp.getMessage());exp.printStackTrace();}}/*** 获取注解中对方法的描述信息 用于Controller层注解* param log 日志* param operLog 操作日志* throws Exception*/public void getControllerMethodDescription(JoinPoint joinPoint, Log log, XlOperLog operLog, Object jsonResult) throws Exception {// 设置操作业务类型operLog.setBusinessType(log.businessType().ordinal());// 设置标题operLog.setTitle(log.title());// 是否需要保存request参数和值if (log.isSaveRequestData()) {// 设置参数的信息setRequestValue(joinPoint, operLog);}// 是否需要保存response参数和值if (log.isSaveResponseData() StringUtils.isNotNull(jsonResult)) {operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));}}/*** 获取请求的参数放到log中* param operLog 操作日志* throws Exception 异常*/private void setRequestValue(JoinPoint joinPoint, XlOperLog operLog) throws Exception {String requsetMethod operLog.getRequestMethod();if (HttpMethod.PUT.name().equals(requsetMethod) || HttpMethod.POST.name().equals(requsetMethod)) {String parsams argsArrayToString(joinPoint.getArgs());operLog.setOperParam(StringUtils.substring(parsams,0,2000));} else {Map?,? paramsMap (Map?,?) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);operLog.setOperParam(StringUtils.substring(paramsMap.toString(),0,2000));}}/*** 参数拼装*/private String argsArrayToString(Object[] paramsArray) {String params ;if (paramsArray ! null paramsArray.length 0) {for (Object object : paramsArray) {// 不为空 并且是不需要过滤的 对象if (StringUtils.isNotNull(object) !isFilterObject(object)) {Object jsonObj JSON.toJSON(object);params jsonObj.toString() ;}}}return params.trim();}/*** 判断是否需要过滤的对象。* param object 对象信息。* return 如果是需要过滤的对象则返回true否则返回false。*/SuppressWarnings(rawtypes)public boolean isFilterObject(final Object object) {Class? clazz object.getClass();if (clazz.isArray()) {return clazz.getComponentType().isAssignableFrom(MultipartFile.class);} else if (Collection.class.isAssignableFrom(clazz)) {Collection collection (Collection) object;for (Object value : collection) {return value instanceof MultipartFile;}} else if (Map.class.isAssignableFrom(clazz)) {Map map (Map) object;for (Object value : map.entrySet()) {Map.Entry entry (Map.Entry) value;return entry.getValue() instanceof MultipartFile;}}return object instanceof MultipartFile || object instanceof HttpServletRequest|| object instanceof HttpServletResponse || object instanceof BindingResult;} }4. 标注在接口上 将自定义注解标注在需要记录操作日志的接口上代码如下示例 java复制代码 Log(title 代码生成, businessType BusinessType.GENCODE)ApiOperation(value 批量生成代码)GetMapping(/download/batch)public void batchGenCode(HttpServletResponse response, String tables) throws IOException {String[] tableNames Convert.toStrArray(tables);byte[] data genTableService.downloadCode(tableNames);genCode(response, data);}5. 实现的效果 执行相关操作就会记录日志记录了一些基础信息存在数据表里。 总结 好了以上就是本篇文章的主要内容了本文主要讲述了使用SpringAOP来实现操作日志的记录欢迎评论区留言说说你们的项目中是如何实现操作日志的。 若觉得本文对您有帮助的话还不忘点赞评论关注支持一波哟~
http://www.pierceye.com/news/550529/

相关文章:

  • 电子商务网站开发 php汕头 网站建设
  • 郑州做网站的论坛山西利用模板建站
  • 网站引流.定期报告系统下载官网
  • 北京网站排名珠海 网页设计
  • 长春火车站防疫政策wordpress调用图片代码
  • 建设论坛网站自学江苏中小企业网站建设
  • 东莞网站建设效果好网站建设制作设计
  • 成华区建设局门户网站wordpress.fr
  • 河北制作网站模板建站公司网站开发流程的认识
  • 天津网站建设有哪些做网站的公司为什么人少了
  • 提供中山精品网站建设建俄语网站哪个公司最好
  • 建设银联官方网站怎样在网站做宣传
  • 网站开发支付宝二维码支付建设网站装配式建筑楼房
  • 湖北系统建站怎么用做网站买一个域名就够了吗
  • 如何做问卷调查网站济南网络公司
  • 纯js做网站Wordpress税
  • 建云科技网站首页阿里云 wordpress 安装
  • 浙江省建设工程协会网站动漫网站的设计与实现
  • wordpress能导出网站吗企业内部网站开发
  • 景观石网站建设方案一 网站开发背景
  • 开发app的平台外贸seo建站
  • 网站界面设计实训报告深圳设计公司办公室
  • 京东网站的公司地址别人网站建设多少钱
  • 如何加快网站打开速度wordpress注册怎样通过邮箱验证码
  • 有关图书网站建设策划书电脑公司网站系统源码
  • 西班牙网站后缀360收录提交入口网址
  • 济宁网站建设工程教育网官网学员登录
  • html5导航网站源码下载wordpress 调用 discuz
  • 住房和城乡建设部网站 投诉有哪些网站可以学做糕点的
  • 电商购物网站m3u8插件 wordpress