拦截请求并记录相应信息-springboot
生活随笔
收集整理的這篇文章主要介紹了
拦截请求并记录相应信息-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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring security 学习一
- 下一篇: restful api上传文件(基础)-