声明:本博文如存在问题,欢迎各位dalao指正!!!
任务描述
我们已经学习了Spring和Spring Boot,那么我们怎么把Spring中的面向切面思想与Spring Boot结合使用呢?
本关任务:使用Spring中的AOP记录Web请求日志。
相关知识
为了完成本关任务,你需要掌握:
如何获取Web请求对象;
如何获取Web请求返回的内容。
Sprig Boot整合AOP
1.在pom.xml中添加相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.如何获取 Web 请求对象
在Spring Boot中我们可以通过RequestContextHolder很方便的获取请求对象。
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
获取HttpServletRequest对象后,我们可以获取其中的许多信息,比如:
request.getRequestURL()可以获取URL;
request.getMethod()可以获取请求方式。
3.如何获取 Web 请求返回的内容
使用@AfterReturning通知在切入点返回内容之后切入内容(用来对处理返回值做一些加工处理)
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 获取处理完请求后的返回内容
logger.info("RESPONSE : " + ret);
}
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充(有个pom.xml需要填充相关依赖),使用AOP记录Web登录请求日志,获取请求URL,请求方式以及请求后的返回内容。
并在请求内容前后输出---------------请求内容----------------
在返回内容前后输出---------------返回内容----------------。
后台会自动启动该Spring Boot工程并请求以/Login结尾的Web请求。
1.在pom.xml中添加依赖
2.在controller包中添加Blog包并用方法写出返回值
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 **********/
}
3.从后台获取前端的请求并将请求的数据打印出来
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 {
/********** Begin **********/
// 获取HttpServletRequest对象
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("---------------请求内容----------------");
/********** End **********/
}
//在方法执行完结后打印返回内容
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
/********** Begin **********/
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
// 处理完请求,打印返回内容
logger.info("RESPONSE : "+ret);
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
/********** End **********/
}
}
总结:
controller包中的是返回给前端的值,而BlogAspect类则是接收前端传到后台的值,然后定义切点将返回值返回到前端,这样就实现了前端与后台的数据交互了。