RESTful API的拦截方式 (过滤器Filter)拦截器(Interceptor)切片(Aspect)
优先级按排序
1 过滤器(Filter) 最先进入拦截,只能获取到response,request
2 拦截器(Interceptor) 可以获取到执行的类名,方法名
3 切片(Aspect) 可以获取到参数
具体使用哪一个看业务需求吧.
1 过滤器(Filter)
自定义Filter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.imooc.web.filter; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @Component // 增加一个注解即可使用,不需要其他配置,会拦截所有请求 public class TimeFilter implements Filter { @Override public void destroy() { System.out.println( "time filter destroy" ); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println( "time filter start" ); long start = new Date().getTime(); chain.doFilter(request, response); // 继续执行程序,不调用doFilter 不会往下执行 System.out.println( "time filter 耗时:" + ( new Date().getTime() - start)); System.out.println( "time filter finish" ); } @Override public void init(FilterConfig arg0) throws ServletException { // 程序启动会加载 System.out.println( "time filter init" ); } } |
如果是引用第三方的Filter 使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.imooc.web.config; import java.util.ArrayList; import java.util.List; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.imooc.web.filter.TimeFilter; @Configuration public class WebConfig { @Bean public FilterRegistrationBean timeFilter() { // 注册第三方Filter FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TimeFilter timeFilter = new TimeFilter(); registrationBean.setFilter(timeFilter); // 需要拦截的url List<String> urls = new ArrayList<>(); urls.add( "/*" ); registrationBean.setUrlPatterns(urls); return registrationBean; } } |
2 拦截器(Interceptor)
2.1自定义Interceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.imooc.web.interceptor; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @Component public class TimeInterceptor implements HandlerInterceptor { // 先进入该方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println( "preHandle" ); System.out.println(((HandlerMethod)handler).getBean().getClass().getName()); System.out.println(((HandlerMethod)handler).getMethod().getName()); request.setAttribute( "startTime" , new Date().getTime()); return true ; // 返回true才能继续执行controller } // 如果Controller方法抛出了异常,不会进入该方法 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println( "postHandle" ); Long start = (Long) request.getAttribute( "startTime" ); System.out.println( "time interceptor 耗时:" + ( new Date().getTime() - start)); } // 不管方法是不是抛出异常 都会进入该方法 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println( "afterCompletion" ); Long start = (Long) request.getAttribute( "startTime" ); System.out.println( "time interceptor 耗时:" + ( new Date().getTime() - start)); System.out.println( "ex is " +ex); } } |
2.2 注入自定义的Interceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.imooc.web.config; import com.imooc.web.interceptor.TimeInterceptor; import org.springframework.beans.factory.annotation.Autowired; 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 TimeInterceptorConfig extends WebMvcConfigurerAdapter { // 自定义的Interceptor @Autowired private TimeInterceptor timeInterceptor; // 注入spring @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(timeInterceptor); } } |
3 切片(Aspect)
自定义切片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.imooc.web.aspect; import java.util.Date; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class TimeAspect { // 切入具体的方法,拦截UserController的所有方法 @Around ( "execution(* com.imooc.web.controller.UserController.*(..))" ) public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable { System.out.println( "time aspect start" ); Object[] args = pjp.getArgs(); // 可以获取方法参数 for (Object arg : args) { System.out.println( "arg is " +arg); } long start = new Date().getTime(); Object object = pjp.proceed(); // 继续往下执行Controller System.out.println( "time aspect 耗时:" + ( new Date().getTime() - start)); System.out.println( "time aspect end" ); return object; } } |
标签:
SpringBoot
, Spring Cloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2018-11-28 解决 spring boot Failed to decode downloaded font