通过AOP切控制层,获取请求信息

前言:

	通过使用AOP获取被调接口的请求信息,然后再切面中处理具体的业务需求

代码示例如下:

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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.util.Arrays;
import java.util.Enumeration;

@Component
@Aspect
@Slf4j
public class ActionAspect {

    /**
     * cpointcut  all of the action all methods.
     * 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
     */
    @Pointcut(value = "execution(* cn.swifthealth.api..*.*Controller..*(..))")
    public void aspect() {
    }

    /**
     * 配置前置通知,使用在方法aspect()上注册的切入点
     * 同时接受JoinPoint切入点对象,可以没有该参数
     */
    @Before("aspect()")
    public void before(JoinPoint joinPoint) {
        log.info("the  request details:");
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //log 请求内容
        log.info("请求url:  {}", request.getRequestURL().toString());
        log.info("请求方法:  {}", request.getMethod());
        String className = joinPoint.getSignature().getDeclaringTypeName();

        log.info("执行的类名: {}", "(" + className.substring(className.lastIndexOf(".") + 1) + ".java:1)");
        log.info("执行的方法名: {}", joinPoint.getSignature().getName());
        log.info("参数: {}", Arrays.toString(joinPoint.getArgs()));
        //log 方法参数
        Enumeration<String> enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String paraName = enu.nextElement();
            log.info(paraName + ":    {}", request.getParameter(paraName));
        }
    }


    @Around("aspect()")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String method = request.getMethod().toLowerCase();

        try {
            //对于业务抛出异常的记录就处理
            long start = System.currentTimeMillis();
            Object rvt = jp.proceed(args);
            long end = System.currentTimeMillis();
            log.info("-----------------------------------");
            log.info("执行时间为[{}]ms", (end - start));
            log.info("-----------------------------------");

            if (method.equals("options")) {
                return rvt;
            }
            //记录请求日志
            return rvt;
        } catch (Exception e) {
            log.error("系统错误catch:", e);
            e.printStackTrace();
            //继续抛出异常
            throw e;
        }

    }

    //配置后置通知,使用在方法aspect()上注册的切入点
    @After(value = "aspect()")
    public void after() {

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于SSM+MySQL的教师管理信息系统是一个旨在提升教师管理效率和便利性的在线平台。该系统采用了SSM(Spring+SpringMVC+MyBatis)框架作为后端开发技术,使用MySQL数据库进行数据存储和管理。 该系统的主要目标是提供一个集中管理教师信息和工作流程的平台,方便学校或教育机构对教师的管理和协调。系统的核心功能包括教师信息管理、课程安排、考勤管理、绩效评估等。通过该系统,教育机构可以方便地录入和管理教师的基本信息、教学经历、职称等,并根据需求进行教师的课程分配和排班。同时,系统还支持考勤管理和绩效评估,帮助管理者更好地跟踪教师的出勤情况和绩效表现。 系统的后端采用SSM框架,Spring框架提供了IoC(控制反转)和AOP(面向面编程)等功能,简化了系统的开发和配置。SpringMVC作为一个基于MVC(模型-视图-控制器)的框架,提供了良好的请求处理和页面跳转机制。MyBatis作为一个优秀的持久框架,简化了与数据库的交互操作。 系统的数据存储和管理使用MySQL数据库,MySQL是一种流行的关系型数据库管理系统,具有稳定性和高性能的特点。通过MySQL,系统可以存储和管理教师的个人信息、课程安排、考勤记录、绩效评估等数据。同时,系统还支持快速的数据查询和处理,以便管理员能够方便地获取相关信息。 基于SSM+MySQL的教师管理信息系统旨在提供一个高效、便捷的教师管理平台,优化教师的工作流程和管理流程。通过该系统,教育机构可以更好地管理教师信息、分配课程和监督教师的工作情况。系统的自动化考勤管理和绩效评估功能帮助管理者更好地掌握教师的出勤情况和工作表现,提高教师管理的效率和准确性。通过该系统,教育机构能够更好地支持教师的工作和发展,提升整的教学质量和教育水平。
对于 SaaS 多租户应用中的字段隔离,控制需要负责从请求获取租户 ID,并将其传递给业务逻辑进行处理。这可以通过 AOP 技术实现,在请求执行前将租户 ID 注入到业务逻辑的方法参数中。 下面是一个示例代码: ```java @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; // 业务逻辑 @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable("id") Long id, @RequestParam("tenantId") Long tenantId) { User user = userService.getUserById(id, tenantId); if (user == null) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok(user); } @PostMapping public ResponseEntity<User> createUser(@RequestBody User user, @RequestParam("tenantId") Long tenantId) { userService.createUser(user, tenantId); return ResponseEntity.status(HttpStatus.CREATED).body(user); } @PutMapping("/{id}") public ResponseEntity<User> updateUser(@PathVariable("id") Long id, @RequestBody User user, @RequestParam("tenantId") Long tenantId) { User existingUser = userService.getUserById(id, tenantId); if (existingUser == null) { return ResponseEntity.notFound().build(); } existingUser.setName(user.getName()); existingUser.setEmail(user.getEmail()); userService.updateUser(existingUser); return ResponseEntity.ok(existingUser); } @DeleteMapping("/{id}") public ResponseEntity<Void> deleteUser(@PathVariable("id") Long id, @RequestParam("tenantId") Long tenantId) { User existingUser = userService.getUserById(id, tenantId); if (existingUser == null) { return ResponseEntity.notFound().build(); } userService.deleteUser(existingUser); return ResponseEntity.noContent().build(); } } ``` 在这个示例中,我们在每个方法的参数列表中添加了 @RequestParam("tenantId") 注解,用于从请求获取租户 ID。在具业务逻辑的实现中,我们需要将租户 ID 作为参数传递给业务逻辑的方法进行处理。这样就可以实现对不同租户的数据进行隔离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值