SpringAOP获取请求信息

摘要:
当您需要在aop中获取请求参数并拦截它们时,可以参考以下方法:packagecom.zxh。配置;importcom.alibaba.fastjson。JSON;importcom.alibaba.fastjson。JSONObject;importcom.fasterxml.jackson.core。JsonProcessingException;导入更快

当需要在aop中获取请求的参数,并做拦截时,可以参考下面的方法:

package com.zxh.configure;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;

@Aspect
@Component
@Slf4j
public class ControllerAspect {

    private static ObjectMapper objectMapper = new ObjectMapper();

    @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
    public void controllerGetMethodPointcut() {
    }

    @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
    public void controllerPostMethodPointcut() {
    }

    @Before("controllerGetMethodPointcut()")
    public void doBeforeGetMethod(JoinPoint joinPoint) throws Exception {
        Map<String, Object> requestParams = getRequestParams(joinPoint);
    }

    @Before("controllerPostMethodPointcut()")
    public void doBeforePostMethod(JoinPoint joinPoint) throws Exception {
        Map<String, Object> requestParams = this.getRequestParams(joinPoint);
        this.preHandle(requestParams);
    }

    private void preHandle(Map<String, Object> requestParams) {
        String uri = (String) requestParams.get("uri");
        String method = (String) requestParams.get("method");
        String params = ((List<String>) requestParams.get("params")).get(0);
        JSONObject headers = (JSONObject) requestParams.get("headers");
        if (!HttpMethod.POST.toString().equals(method)) {
            throw new RuntimeException("方法不被允许");
        }
     //写具体的业务,用于拦截。不符合条件时直接抛出异常,全局捕获异常进行处理

    }

    //获取请求的相关信息
    private Map<String, Object> getRequestParams(JoinPoint joinPoint) throws UnsupportedEncodingException {
        Map<String, Object> requestParams = new HashMap<>();
        //获取请求信息
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        requestParams.put("uri", request.getRequestURI());
        // 获取请求头信息,需要注意的是,请求头中的key都会转成小写
        Enumeration<String> enumeration = request.getHeaderNames();
        JSONObject headers = new JSONObject();
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement();
            String value = request.getHeader(name);
            headers.put(name, value);
        }
        requestParams.put("headers", headers);
        //获取请求的方法
        String method = request.getMethod();
        requestParams.put("method", method);
        List<String> params = new ArrayList<>();
        if (HttpMethod.GET.toString().equals(method)) {// get请求
            String queryString = request.getQueryString();
            if (StringUtils.isNotBlank(queryString)) {
                params.add(0, URLDecoder.decode(queryString, "UTF-8"));
            }
        } else {//其他请求
            Object[] paramsArray = joinPoint.getArgs();
            if (paramsArray != null && paramsArray.length > 0) {
                for (int i = 0; i < paramsArray.length; i++) {
                    if (paramsArray[i] instanceof Serializable || paramsArray[i] instanceof RequestFacade) {
                        params.add(paramsArray[i].toString());
                    } else {
                        try {
                            //使用json系列化 反射等等方法 反系列化会影响请求性能建议重写toString方法实现系列化接口
                            String param = objectMapper.writeValueAsString(paramsArray[i]);
                            if (StringUtils.isNotBlank(param))
                                params.add(param);
                        } catch (JsonProcessingException e) {
                            e.printStackTrace();
                            log.error("json序列化异常", e);
                        }
                    }
                }
            }
        }

        log.info(">>>>>>uri: {},method: {}", request.getRequestURI(), method);
        log.info(">>>>>>headers: {}", headers);
        log.info(">>>>>>params: {}", params);
        requestParams.put("params", params);
        return requestParams;
    }


}

使用时需要导入aop的依赖:

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

分别请求下面的路径,进行测试

get请求:

SpringAOP获取请求信息第1张

日志打印结果

SpringAOP获取请求信息第2张

post请求

SpringAOP获取请求信息第3张

日志打印结果

SpringAOP获取请求信息第4张

免责声明:文章转载自《SpringAOP获取请求信息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux中export的作用图片懒加载的几种优秀的方式(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

读取XML文件

读取指定路径下XML文件,并将读取值赋值给字典。         /// <summary>        /// 自定义配置文件custom.xml的节点内容集合        /// </summary> public Dictionary<string, string> DicCustomText = new Di...

通过url 下载文件

1、问题简介   通过文件的url,将文件下载到本地。文件存储的位置为:tomcat服务器的文件夹(通过读取properties文件:可看:http://www.cnblogs.com/0201zcr/p/4700418.html) 2、实现思路   读取properties文件,将获得文件将要存储的位置   通过java的Url类,将网上的文件下载到本地...

基于jmeter-dubbo协议压测实践

背景 为了满足公司业务发展及性能要求,公司技术架构在很多业务接口调用设计中引用到了dubbo协议调用方式,对于以前HTTP feign调用的接口转为dubbo泛化调用后,接口性能如何?有何影响?需要进行压测评估。为解决公司RPC dubbo协议调用压测问题,需升级jmeter压测组件,扩展压测协议支持。   Dubbo泛化调用原理 在进行dubbo协议接...

Java安全之安全加密算法

Java安全之安全加密算法 0x00 前言 本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多。了解的层次只是基于加密算法的一些应用上。也来浅谈一下加密算法在安全领域中的作用。写本篇文也是基于算法的应用和实现,也是我的基本原则,能用就行。 0x01 算法体制 在加密算法里面大致分为四大类:对称加密算法、非对称加密算法、散列函数、组合加...

神舟K650c i7(W350STQ)上成功装好Mac OS X 10.9,兼谈如何安装WinXP、7、8.1、OSX、Ubuntu五系统(Chameleon、MBR)

作者:zyl910   参考教程——http://bbs.pcbeta.com/viewthread-1432534-1-4.html笔记本SNB和IVY平台Win7/Win8/Win8.1安装OS X Mavericks懒人版通用教程   根据该文的操作步骤,顺利时略写,遇到问题或需要补充时才详细叙述。   教程贴外所用的软件、驱动——http://pa...

HttpClient的get和post方式提交数据的使用

/** * Http工具类 */ public class HttpUtil { // 创建HttpClient对象 public static HttpClient httpClient = new DefaultHttpClient(); public static final String BASE_URL =...