日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拦截请求并记录相应信息-springboot

發布時間:2024/9/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拦截请求并记录相应信息-springboot 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

攔截請求并記錄相應信息-springboot

方式:

1、FIlter過濾器

2、interceptor攔截器

3、Aspect切片

?

一、Filter過濾器形式

  只能處理request中的數據? 不能確定請求要走的是哪個controller信息

1、過濾器實現第一種方式

package com.nxz.filter;import org.springframework.stereotype.Component;import javax.servlet.*; import java.io.IOException; import java.util.Date;// Filter 是javax.servlet下的 @Component //讓自定義filter起作用,只需要讓springcontext管理起來即可 public class TimeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long time = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("消耗時間:" + (new Date().getTime() - time));System.out.println("time filter start");}@Overridepublic void destroy() {System.out.println("time filter destroy");} }

當項目啟動的時候會在控制臺輸出:time filter init

當訪問localhost:8080/user/1時:進入攔截器

結束結束后:

time filter start 進入getinfo服務 消耗時間:367 time filter end

?

2、filter過濾器第二種方式

package com.nxz.filter;import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class WebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();TimeFilter timeFilter = new TimeFilter();filterRegistrationBean.setFilter(timeFilter);//指定什么樣的請求回走timefilter過濾器filterRegistrationBean.addUrlPatterns("/*");return filterRegistrationBean;} }

?

?

二、inteceptor攔截器

  只能處理到類中的方法,但是不能記錄方法的參數是什么

package com.nxz.inteceptor;import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date;@Component public class TimeInteceptor implements HandlerInterceptor {//在controller調用之前調用@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) o).getBean().getClass().getName());//輸出類名System.out.println(((HandlerMethod) o).getMethod().getName());//輸出方法名//為了在prehandler方法和posthandler方法之間傳遞信息,可以將數據放到request中httpServletRequest.setAttribute("startTime", new Date().getTime());return false;}//在controller調用之后調用,如果controller中拋出異常,這個方法不會調用@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");Long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗時:" + (new Date().getTime() - start));}//無論controller是否拋出異常,都會調用@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗時:" + (new Date().getTime() - start));System.out.println("ex is :" + e);} }

interceptor實現攔截功能還需要配置webconfig

package com.nxz.config;import com.nxz.filter.TimeFilter; import com.nxz.inteceptor.TimeInteceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate TimeInteceptor timeInteceptor;//自定義的interceptor 要起作用的話 需要繼承webmvcConfigurerAdater ,重寫addInterceptors@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(timeInteceptor);} }

訪問localhost:8080/user/1后,輸入日志:

preHandler com.nxz.controller.UserController getInfo 進入getinfo服務 postHandle time interceptor 耗時:48 afterCompletion time interceptor 耗時:48 ex is :null

?

?三、切片Aspect(AOP)? -- 切入點(注解)、增強(方法)

  需要導入aop依賴

package com.nxz.aspect;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component;import java.util.Date;@Aspect @Component public class TimeAspect {//@Before @After @AfterThrowing @Around 基本的aop注解@Around("execution(* com.nxz.controller.UserController.*(..))")public Object handlerControllerMehtod(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("time aspect start");Object[] args = joinPoint.getArgs();for (Object arg : args) {System.out.println(arg);}Long time = new Date().getTime();Object obj = joinPoint.proceed();System.out.println("time aspect end,耗時:" + (new Date().getTime() - time));return obj;}}

訪問地址后:

time aspect start 1 --》請求參數 進入getinfo服務 time aspect end,耗時:4

?

?幾種方式起作用的順序:

?

?

====

?Usercontroller:

@GetMapping("/{id:\\d+}")@JsonView(User.UserDetailView.class)public User getInfo(@PathVariable String id) {System.out.println("進入getinfo服務");User user = new User();user.setUsername("tom");return user;}

?

posted @ 2019-04-28 22:44 巡山小妖N 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的拦截请求并记录相应信息-springboot的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。