ProceedingJoinPoint 获取url
时间: 2024-01-18 17:15:37 浏览: 233
可以通过ProceedingJoinPoint获取url。具体实现方法如下:
1.在方法参数中添加ProceedingJoinPoint参数。
2.通过ProceedingJoinPoint参数获取ServletRequestAttributes对象。
3.通过ServletRequestAttributes对象获取HttpServletRequest对象。
4.通过HttpServletRequest对象获取url。
代码示例:
```
public void test(ProceedingJoinPoint point) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String url = request.getRequestURL().toString();
// do something with url
}
```
相关问题
ProceedingJoinPoint获取get请求和post请求的参数
ProceedingJoinPoint是Spring AOP中的一个关键对象,用于在切面中获取方法的参数和执行方法。对于获取get请求和post请求的参数,可以通过以下方式使用ProceedingJoinPoint:
1. 获取get请求参数:
- 在切面方法中,通过ProceedingJoinPoint对象的getArgs()方法获取方法的参数数组。
- 对于get请求,参数通常是通过URL中的查询字符串传递的,可以通过解析URL中的查询字符串来获取参数。
- 可以使用Spring的UriComponentsBuilder类来解析URL中的查询字符串,例如:
```java
public void beforeAdvice(ProceedingJoinPoint joinPoint) {
// 获取方法参数
Object[] args = joinPoint.getArgs();
// 解析URL中的查询字符串
String queryString = ServletRequestUtils.getQueryString(request);
MultiValueMap<String, String> queryParams = UriComponentsBuilder.fromUriString(queryString).build().getQueryParams();
// 获取具体参数值
String param1 = queryParams.getFirst("param1");
String param2 = queryParams.getFirst("param2");
// 处理参数...
}
```
2. 获取post请求参数:
- 在切面方法中,通过ProceedingJoinPoint对象的getArgs()方法获取方法的参数数组。
- 对于post请求,参数通常是通过请求体中的表单数据或JSON数据传递的。
- 可以根据具体的请求类型来获取参数,例如:
- 对于表单数据,可以通过HttpServletRequest对象的getParameter()方法来获取参数值。
- 对于JSON数据,可以通过HttpServletRequest对象的getInputStream()方法获取请求体的输入流,然后使用相关的JSON库来解析JSON数据。
- 也可以使用Spring的RequestBody注解来获取请求体中的参数,例如:
```java
public void beforeAdvice(ProceedingJoinPoint joinPoint, @RequestBody MyRequestObject requestObject) {
// 处理请求体中的参数...
}
```
注意:以上示例代码仅为演示获取参数的方式,具体实现可能需要根据实际情况进行调整。
按下面代码统计接口调用的次数:@Order(999) @Aspect @Component public class MonitorAspect { @Autowired private RabbitTemplate rabbitTemplate; @Pointcut("@annotation(com.sinosoft.common.messagestorage.annotation.Monitor)") public void monitorPointcut(){} @Around("monitorPointcut()") public Object monitor(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法参数和注解信息 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Object[] args = joinPoint.getArgs(); ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); Monitor monitor = method.getAnnotation(Monitor.class); // 记录监控信息 String requestUrl = requestAttributes.getRequest().getRequestURI(); String serviceName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); String source = args.length > 0 ? args[0].toString() : ""; long startTime = System.currentTimeMillis(); int status = 200; Object result = null; try { result = joinPoint.proceed(); } catch (Exception e) { status = 500; throw e; } finally { long endTime = System.currentTimeMillis(); monitor(serviceName, source, status, startTime, endTime); } // 返回方法结果 return result; } private void monitor(String serviceName, String source, int status, long startTime, long endTime) { // 记录监控信息 Message message = new Message(); message.setServiceName(serviceName); message.setSource(source); message.setStatus(status); message.setStartTime(startTime); message.setEndTime(endTime); // 发送消息到MQ rabbitTemplate.setExchange("monitor.queue.test"); rabbitTemplate.setRoutingKey("monitorRoutingKey"); rabbitTemplate.convertAndSend(message); // rabbitTemplate.convertAndSend("monitor.queue.test", "monitorRoutingKey", message); } }
这段代码是一个 Spring AOP 切面,用于统计被 @Monitor 注解标记的方法的调用次数以及调用时间等信息,并将这些信息记录到 RabbitMQ 中。
具体实现方式是,在切面的 monitor 方法中,获取被注解的方法的相关信息,包括方法名、参数、注解信息等,然后记录调用开始时间,执行被注解的方法,记录调用结束时间,最终将这些信息封装成一个 Message 对象,通过 RabbitMQ 发送出去。
需要注意的是,这段代码中用到了 RabbitMQ 的相关 API,需要先配置好 RabbitMQ 的连接和 Exchange、Queue。
阅读全文