使用Aop处理请求

C语言是面向过程的,c++是面向对象的

面向过程到面向对象

面向过程

假如下雨了,我打开了雨伞

面向对象

实例一个天气对象,赋予一个下雨的动作

实例一个我,赋予一个打伞的动作

总而言之,二者是换了个角度看世界,换个姿势处理问题

面向对象是将需求功能垂直划分为不同的,相对独立的,封装成良好的类。有自己的函数,AOP技术恰恰相反他利用的是一种的横切的技术,将面向对象的封装的类进行水平的切割。

将通用逻辑从业务逻辑中分离出来

网络请求的生命周期:从客户端收到HttpRequest请求,记录请求,处理请求,生成HttpResponse返回给客户端,返回给客户端之前再次记录

操作数据库的生命周期:收到数据库才做请求,记录请求,增删改查,生成处理结果,记录回复。

假设我们在执行controller里面的方法时要保证执行每一个方法时都必须进行登陆验证,这就很麻烦了,不可能每一个方法都写一个判断语句,我们可以在contrller的构造函数里面写if语句,但是spring在启动的时候就将类给实例化了,当客户端发http请求时,压根就调用不到那个构造方法。我们就必须写一个统一的类

使用aop

1)添加依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2)新建一个处理文件aspect,在新建一个类

3)类名上面要添加一个@Aspect和@Component注解,将这个类引入到spring 容器里面去

4)我们希望在http请求到controller方法之前就将他记录下来。在要调用的方法前面写@Before("excution(public * com.imooc.comtroller.UserController.getList(..))")

注解里面写要拦截的方法路径及名称,方法里面两个点代表这个方法名的任意参数方法,如果需要拦截所有方法就*(..)

5)请求处理之后要要调用的方法就加@After(”excution(public * com.imooc.comtroller.UserController.getList(..))“)

使用aop处理整合加强版

1)上面@Before,@After里面有重复的代码,我们将@Before改为@Pintcut,函数体删掉,@After("")里面写上@Pintcut的函数名,@Before也是一样的

2)前面的@Before,@After的函数体都是system的打印方式,其实我们可以换一下用spring自带的框架Logger

在aop类里面添加private final static Logger logger=LoggerFactory.getLogger(HttpAspect.class);

将system换位logger.info("111111")

3)获取返回的内容@AfterReturning(returning="object" pointcut="log()")returning是入参参数

package com.example.demo.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author :zhanglu
 * @Description:@Component是将文件引入到sprin容器里
 * @Date :Created in 17:20 2017/11/6
 * @Modified By:
 */
@Aspect
@Component
public class HttpAspect{
    private  final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
    @Pointcut("execution(public * com.example.demo.controller.UserControler.*(..))")
    public void log(){
    }
//    方法执行之前就已经执行
    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURL());
        //Method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("method={}",request.getRemoteAddr());
        //类方法
        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //参数
        logger.info("args={}",joinPoint.getArgs());
        logger.info("1111");
    }
    //方法执行后
    @After("log()")
    public void doAfter(){
        logger.info("2222");
    }
    @AfterReturning(returning ="object",pointcut="log()")
    public void doAfterReturning(Object object){
       logger.info("response={}",object);
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值