真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springboot中怎么利用AOP統(tǒng)一處理web請(qǐng)求

springboot中怎么利用AOP統(tǒng)一處理web請(qǐng)求,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為無(wú)為等服務(wù)建站,無(wú)為等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為無(wú)為企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

基本思想:

采用AOP的方式,攔截請(qǐng)求,寫(xiě)入日志

AOP 是面向切面的編程,就是在運(yùn)行期通過(guò)動(dòng)態(tài)代理的方式對(duì)代碼進(jìn)行增強(qiáng)處理

基于AOP不會(huì)破壞原來(lái)程序邏輯,因此它可以很好的對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

1.添加依賴

  org.springframework.boot   spring-boot-starter-web   org.springframework.boot   spring-boot-starter-aop

引入spring-boot-starter-web 依賴之后無(wú)需在引入相關(guān)的日志依賴,spring-boot-starter-web中已經(jīng)集成了slf4j 的依賴

引入spring-boot-starter-aop 依賴之后,AOP 的功能即是啟動(dòng)狀態(tài)

2.配置

application.properties添加

# AOPspring.aop.auto=truespring.aop.proxy-target-class=true

logback-spring.xml,主要是ControllerRequest那部分

                                 info              ${CONSOLE_LOG_PATTERN}            UTF-8                    ${log.path}/debug/debug.log              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n      UTF-8                        ${log.path}/debug/debug-%d{yyyy-MM-dd}.%i.log              100MB                  15                  debug      ACCEPT      DENY                  ${log.path}/info/info.log              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n      UTF-8                        ${log.path}/info/info-%d{yyyy-MM-dd}.%i.log              100MB                  15                  info      ACCEPT      DENY                  ${log.path}/warn/warn.log              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n      UTF-8                  ${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log              100MB                  15                  warn      ACCEPT      DENY                  ${log.path}/error/error.log              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n      UTF-8                  ${log.path}/error/error-%d{yyyy-MM-dd}.%i.log              100MB                  15                  ERROR      ACCEPT      DENY                                                                                          ${log.path}/request/info.log          ${log.path}/request/info.log.%d{yyyy-MM-dd}      30              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n              

3..實(shí)現(xiàn)

實(shí)現(xiàn)切面的注解

(1)類注解

A. @Aspect 將一個(gè)java類定義為切面類

B. @order(i) 標(biāo)記切面類的處理優(yōu)先級(jí),i值越小,優(yōu)先級(jí)別越高??梢宰⒔忸?也能注解到方法上

(2)方法注解

A. @Pointcut 定義一個(gè)切入點(diǎn),可以是一個(gè)表達(dá)式

execution表達(dá)式,eg:

任意公共方法的執(zhí)行execution(public * *(..)) 任何一個(gè)以“set”開(kāi)始的方法的執(zhí)行execution(* set*(..)) 定義在controller包里的任意方法的執(zhí)行execution(public * com.example.demo.controller.*(..)) 定義在controller包里的任意方法的執(zhí)行execution(public * com.example.demo.controller.*.*(..)) 定義在controller包和所有子包里的任意類的任意方法的執(zhí)行execution(public * com.example.demo.controller..*.*(..))

B. 實(shí)現(xiàn)在不同的位置切入

@Before 在切點(diǎn)前執(zhí)行方法,內(nèi)容為指定的切點(diǎn)  @After 在切點(diǎn)后,return前執(zhí)行  @AfterReturning 切入點(diǎn)在 return內(nèi)容之后(可用作處理返回值)  @Around 切入點(diǎn)在前后切入內(nèi)容,并自己控制何時(shí)執(zhí)行切入的內(nèi)容  @AfterThrowing 處理當(dāng)切入部分拋出異常后的邏輯

C.@order(i) 標(biāo)記切點(diǎn)的優(yōu)先級(jí),i越小,優(yōu)先級(jí)越高

@order(i)注解說(shuō)明

注解類,i值是,值越小,優(yōu)先級(jí)越高

注解方法,分兩種情況

注解的是 @Before 是i值越小,優(yōu)先級(jí)越高

注解的是 @After或@AfterReturning 中,i值越大,優(yōu)先級(jí)越高

具體實(shí)現(xiàn)

package com.example.demo.configure;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.DefaultParameterNameDiscoverer;import org.springframework.core.ParameterNameDiscoverer;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 java.lang.reflect.Method;import java.net.InetAddress;import java.util.HashMap;import java.util.Map;@Aspect@Componentpublic class WebRequestLogAspect {  private final Logger loggerController = LoggerFactory.getLogger("ControllerRequest");  private final Logger logger = LoggerFactory.getLogger(WebRequestLogAspect.class);  ThreadLocal startTime = new ThreadLocal<>();  ThreadLocal beanName = new ThreadLocal<>();  ThreadLocal user = new ThreadLocal<>();  ThreadLocal methodName = new ThreadLocal<>();  ThreadLocal params = new ThreadLocal<>();  ThreadLocal remoteAddr = new ThreadLocal<>();  ThreadLocal uri = new ThreadLocal<>();  private static Map getFieldsName(ProceedingJoinPoint joinPoint) {    // 參數(shù)值    Object[] args = joinPoint.getArgs();    ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();    MethodSignature signature = (MethodSignature) joinPoint.getSignature();    Method method = signature.getMethod();    String[] parameterNames = pnd.getParameterNames(method);    Map paramMap = new HashMap<>(32);    for (int i = 0; i < parameterNames.length; i++) {      paramMap.put(parameterNames[i], args[i] + "(" + args[i].getClass().getSimpleName() + ")");    }    return paramMap;  }  @Pointcut("execution(public * com.example.demo.controller..*.*(..))")  public void webRequestLog() {  }  /**   * 前置通知,方法調(diào)用前被調(diào)用   * @param joinPoint   */  @Before("webRequestLog()")  public void doBefore(JoinPoint joinPoint) {    try {      startTime.set(System.currentTimeMillis());      // 接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容      ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();      HttpServletRequest request = attributes.getRequest();      beanName.set(joinPoint.getSignature().getDeclaringTypeName());      methodName.set(joinPoint.getSignature().getName());      uri.set(request.getRequestURI());      remoteAddr.set(getIpAddr(request));      user.set((String) request.getSession().getAttribute("user"));    } catch (Exception e) {      logger.error("***操作請(qǐng)求日志記錄失敗doBefore()***", e);    }  }  /**   * 環(huán)繞通知,環(huán)繞增強(qiáng),相當(dāng)于MethodInterceptor   * @param thisJoinPoint   */  @Around("webRequestLog()")  public Object proceed(ProceedingJoinPoint thisJoinPoint) throws Throwable {    Object object = thisJoinPoint.proceed();    Map fieldsName = getFieldsName(thisJoinPoint);    params.set(fieldsName.toString());    return object;  }  /**   * 處理完請(qǐng)求返回內(nèi)容   * @param result   */  @AfterReturning(returning = "result", pointcut = "webRequestLog()")  public void doAfterReturning(Object result) {    try {      long requestTime = (System.currentTimeMillis() - startTime.get()) / 1000;      loggerController.info("請(qǐng)求耗時(shí):" + requestTime + ", uri=" + uri.get() + "; beanName=" + beanName.get() + "; remoteAddr=" + remoteAddr.get() + "; user=" + user.get()          + "; methodName=" + methodName.get() + "; params=" + params.get() + "; RESPONSE : " + result);    } catch (Exception e) {      logger.error("***操作請(qǐng)求日志記錄失敗doAfterReturning()***", e);    }  }  /**   * 獲取登錄用戶遠(yuǎn)程主機(jī)ip地址   *   * @param request   * @return   */  private String getIpAddr(HttpServletRequest request) {    String ip = request.getHeader("x-forwarded-for");    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("Proxy-Client-IP");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("WL-Proxy-Client-IP");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getRemoteAddr();      if (ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")) {        //根據(jù)網(wǎng)卡取本機(jī)配置的IP        InetAddress inet = null;        try {          inet = InetAddress.getLocalHost();        } catch (Exception e) {          e.printStackTrace();        }        ip = inet.getHostAddress();      }    }    // 多個(gè)代理的情況,第一個(gè)IP為客戶端真實(shí)IP,多個(gè)IP按照','分割    if (ip != null && ip.length() > 15) {      if (ip.indexOf(",") > 0) {        ip = ip.substring(0, ip.indexOf(","));      }    }    return ip;  }}

4.測(cè)試類

package com.example.demo.controller;import com.alibaba.fastjson.JSONObject;import com.example.demo.dao.UserRepository;import com.example.demo.domain.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;import java.util.Map;@RestControllerpublic class Demo {  @RequestMapping (value = "test1")  public String test1(@RequestParam(defaultValue = "0") Integer id,@RequestParam(defaultValue = "0")String name){    return id+name;  }  @RequestMapping("hello")  public String hello() {    return "Hello World!";  }  @PostMapping("/updateStatus")  public Object updateStatus(@RequestBody JSONObject jsonParam) {    return jsonParam;  }}

輸出到logs/request/info.log內(nèi)容

2019-09-11 13:31:45.729 [http-nio-8080-exec-4] INFO ControllerRequest - 請(qǐng)求耗時(shí):0, uri=/test1; beanName=com.example.demo.controller.Demo; remoteAddr=172.27.0.17; user=null; methodName=test1; params={name=abcdef(String), id=123(Integer)}; RESPONSE : 123abcdef2019-09-11 13:32:16.692 [http-nio-8080-exec-5] INFO ControllerRequest - 請(qǐng)求耗時(shí):0, uri=/updateStatus; beanName=com.example.demo.controller.Demo; remoteAddr=172.27.0.17; user=null; methodName=updateStatus; params={jsonParam={"id":"17","type":3,"status":2}(JSONObject)}; RESPONSE : {"id":"17","type":3,"status":2}2019-09-11 13:33:32.584 [http-nio-8080-exec-7] INFO ControllerRequest - 請(qǐng)求耗時(shí):0, uri=/hello; beanName=com.example.demo.controller.Demo; remoteAddr=172.27.0.17; user=null; methodName=hello; params={}; RESPONSE : Hello World!

看完上述內(nèi)容,你們掌握springboot中怎么利用AOP統(tǒng)一處理web請(qǐng)求的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前名稱:springboot中怎么利用AOP統(tǒng)一處理web請(qǐng)求
新聞來(lái)源:http://weahome.cn/article/jsohgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部