任务描述
我们已经学习了Spring
和Spring Boot
,那么我们怎么把Spring
中的面向切面思想与Spring Boot
结合使用呢?
本关任务:使用Spring
中的AOP
记录Web
请求日志。
相关知识
为了完成本关任务,你需要掌握:
- 如何获取
Web
请求对象; - 如何获取
Web
请求返回的内容。
step4/hello/src/main/java/com/yy/hello/BlogAspect.java
package com.yy.hello;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class BlogAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
//定义切点
@Pointcut("execution(public * com.yy.hello.controller.Blog.Login())")
public void webLog() {
}
//前置通知,方法调用前被调用
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 打印所给要求中的固定格式
logger.info("---------------请求内容----------------");
//打印URL
logger.info("URL : "+request.getRequestURL());
//打印请求方式
logger.info("HTTP_METHOD : "+request.getMethod());
// 打印所给要求中的固定格式
logger.info("---------------请求内容----------------");
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
// 处理完请求,打印返回内容
logger.info("RESPONSE : "+ret);
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
}
}
step4/hello/src/main/java/com/yy/hello/controller/Blog.java
package com.yy.hello.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Blog {
//添加路由映射到/Login并编写相应方法返回Welcome Login!
/********** Begin **********/
@RequestMapping("/Login")
public String Login(){
return "Welcome Login!";
}
/********** End **********/
}