SpringBoot初体验:Spring Boot练习题

声明:本博文如存在问题,欢迎各位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类则是接收前端传到后台的值,然后定义切点将返回值返回到前端,这样就实现了前端与后台的数据交互了。

发布了53 篇原创文章 · 获赞 16 · 访问量 9256

猜你喜欢

转载自blog.csdn.net/Zheng_lan/article/details/105508603
今日推荐