Spring-boot 配置Aop獲取controller里的request中的參數以及其返回值


 

示例:

當前url:http://localhost:8080/CarsiLogCenter_new/idpstat.jsp?action=idp.sptopn

request.getRequestURL() http://localhost:8080/CarsiLogCenter_new/idpstat.jsp
request.getRequestURI() /CarsiLogCenter_new/idpstat.jsp request.getContextPath()/CarsiLogCenter_new request.getServletPath() /idpstat.jsp request.getQueryString() action=idp.sptopn

 

    public static String getLastAccessUrl(HttpServletRequest request) {
        StringBuffer requestURL = request.getRequestURI();
        String queryString = request.getQueryString();
        if (queryString == null) {
            return requestURL.toString();
        }
        return requestURL + "?" + queryString;
    }

 

 

1、request.getRequestURL()
返回的是完整的url,包括Http協議,端口號,servlet名字和映射路徑,但它不包含請求參數。

2、request.getRequestURI()
得到的是request URL的部分值,並且web容器沒有decode過的

3、request.getContextPath()
返回 the context of the request.

4、request.getServletPath()
返回調用servlet的部分url.

5、request.getQueryString()
返回url路徑后面的查詢字符串

 


首先在你的Maven的pom文件里加入aop的依賴:

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

在spring boot里面一切配置都是很簡單的,下面為我所有被請求到的controller加上Aop的功能吧,看碼:

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;;


@Aspect   //定義一個切面
@Configuration
public class LogRecordAspect {
private static final Logger logger = LoggerFactory.getLogger(UserInterceptor.class);

    // 定義切點Pointcut
    @Pointcut("execution(* com.jiaobuchong.web.*Controller.*(..))")
    public void excudeService() {
    }

    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();

        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String uri = request.getRequestURI();
        String queryString = request.getQueryString();
        logger.info("請求開始, 各個參數, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);

        // result的值就是被攔截方法的返回值
        Object result = pjp.proceed();
        Gson gson = new Gson();
        logger.info("請求結束,controller的返回值是 " + gson.toJson(result));
        return result;
    }
}

 

只要加上上面這個類,Aop就算配置好了,不信,去訪問以下你的Controller試試。對比以前配置aop的方式(xml文件),現在的配置都到Java代碼里來了,@Configuration這個Annotation就是JavaConfig的典型代表,Spring boot在啟動時會會自動去加載這些配置,實現相應的配置功能。這個簡單的小例子算是拋磚引玉吧,我也是參考別人的博客,更多細節,查看下面的博客: 
http://ysj5125094.iteye.com/blog/2151855

http://blog.csdn.net/jiaobuchong/article/details/50420379

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM