一、通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式。这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。

过滤器使用的主要是反射 ;拦截器使用的主要是回调 ;AOP使用的主要是动态代理。
一个请求过来 ,先进行过滤器处理,看程序是否受理该请求。过滤器放过后, 程序中的拦截器进行处理,处理完后进入被AOP动态代理重新编译过的主要业务类进行处理 。

Filter:和框架无关,可以控制最初的http请求,但是更细一点的类和方法控制不了。
Interceptor:可以控制请求的控制器和方法,但控制不了请求方法里的参数(用于处理页面提交的请求响应并进行处理,例如做国际化,做主题更换,过滤等)。
Aspect : 可以自定义切入的点,有方法的参数,但是拿不到http请求,可以通过其他方式如RequestContextHolder获得。

Filter,Interceptor,Aspect 实际上都是对Aop的具体实现。都是对业务逻辑的提取。都可以实现权限检查,日志记录。不同的是使用的范围不同,规范不同,深度不同。

一、Filter

  通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式, 这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。

(1)第一种直接写类实现这个接口。代码如下这个要使用Component注解,当你请求服务器的时候他会对每一个请求进行处理。

  1. package com.nbkj.webFilter;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. import javax.servlet.*;
  6. import java.io.IOException;
  7. import java.util.Date;
  8.  
  9. @Component
  10. public class TimerFilter implements Filter {
  11. @Override
  12. public void init(FilterConfig filterConfig) throws ServletException {
  13. System.out.println("Time filter init");
  14. }
  15.  
  16. @Override
  17. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  18. System.out.println("Time filter start");
  19. filterChain.doFilter(servletRequest, servletResponse);
  20. System.out.println("Time filter finish");
  21. }
  22.  
  23. @Override
  24. public void destroy() {
  25. System.out.println("Time filter destroy");
  26. }
  27. }

(2)第二种可以在WebConfig中配置,这种配置方式为了使用第三方的Filter没有@Compont注解所以使用。代码如下

  1. package com.nbkj.config;
  2.  
  3. import com.nbkj.webFilter.TimerFilter;
  4. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.List;
  10.  
  11. /**
  12. * Web配置
  13. *
  14. * @author hsj
  15. * @Configuration 这个注解声明这个类是配置类
  16. * @create 2017-11-11 18:00
  17. **/
  18.  
  19. @Configuration
  20. public class WebConfig {
  21. @Bean
  22. public FilterRegistrationBean timeFilter() {
  23. FilterRegistrationBean registrationBean = new FilterRegistrationBean();
  24. TimerFilter timerFilter = new TimerFilter();
  25. registrationBean.setFilter(timerFilter);
  26. List<String> urls = new ArrayList<>();
  27. urls.add("/*");
  28. registrationBean.setUrlPatterns(urls);
  29. return registrationBean;
  30. }
  31. }

二、Interceptor

  使用Interceptor这种事spring框架自己带的拦截器,代码如下,它会处理自己写的拦截器,也会拦截的拦截BasicErrorController,可以拿到处理的Controller和拿到处理的方法 但是拿不到具体的请求参数。

  1. package com.nbkj.interceptor;
  2.  
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.web.method.HandlerMethod;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7.  
  8. import javax.persistence.Convert;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.util.Date;
  12.  
  13. /**
  14. * this is spring interceptor
  15. *
  16. * @author hsj
  17. * @create 2017-11-11 18:16
  18. **/
  19.  
  20. @Component
  21. public class TimeInterceptor implements HandlerInterceptor {
  22.  
  23. /**
  24. * 控制器方法处理之前
  25. *
  26. * @param httpServletRequest
  27. * @param httpServletResponse
  28. * @param handler
  29. * @return
  30. * @throws Exception
  31. */
  32. @Override
  33. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
  34. System.out.println("preHandle");
  35. System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
  36. System.out.println(((HandlerMethod) handler).getMethod().getName());
  37. httpServletRequest.setAttribute("startTime", new Date().getTime());
  38. return false;
  39. }
  40.  
  41. /**
  42. * 控制器方法处理之后
  43. * 控制器方法调用不抛异常调用
  44. *
  45. * @param httpServletRequest
  46. * @param httpServletResponse
  47. * @param o
  48. * @param modelAndView
  49. * @throws Exception
  50. */
  51. @Override
  52. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
  53. System.out.println("postHandle");
  54. Long startTime = (Long) httpServletRequest.getAttribute("startTime");
  55. System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
  56. }
  57.  
  58. /**
  59. * 控制器方法抛不抛异常都会被调用
  60. *
  61. * @param httpServletRequest
  62. * @param httpServletResponse
  63. * @param o
  64. * @param e
  65. * @throws Exception
  66. */
  67. @Override
  68. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  69. System.out.println("afterCompletion");
  70. Long startTime = (Long) httpServletRequest.getAttribute("startTime");
  71. System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
  72. System.out.println("ex is" + e);
  73. }
  74. }

添加到拦截器中,WebConfig拦截器注册中心:

  1. package com.nbkj.config;
  2.  
  3. import com.nbkj.interceptor.TimeInterceptor;
  4. import com.nbkj.webFilter.TimerFilter;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.List;
  14.  
  15. /**
  16. * Web配置
  17. *
  18. * @author hsj
  19. * @Configuration 这个注解声明这个类是配置类
  20. * @create 2017-11-11 18:00
  21. **/
  22.  
  23. @Configuration
  24. public class WebConfig extends WebMvcConfigurerAdapter {
  25.  
  26. @Autowired
  27. private TimeInterceptor timeInterceptor;
  28.  
  29. @Override
  30. public void addInterceptors(InterceptorRegistry registry) {
  31. registry.addInterceptor(timeInterceptor);
  32. }
  33.  
  34. }

三、AOP的基本概念

  • Aspect(切面):通常是一个类,里面可以定义切入点和通知
  • JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
  • Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
  • Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  • AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

Spring AOP

  Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。

基于注解的AOP配置方式

启用@AsjectJ支持,在applicationContext.xml中配置下面一句:

  1. <aop:aspectj-autoproxy />
  • Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
  • AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
  • AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名

来访问目标方法中所抛出的异常对象

  • After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
  • Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint,使用环绕通知,切入要切入的类,当请求的时候回拦截下来,这样可以获取拦截的方法的参数。
  1. package com.nbkj.aspect;
  2.  
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.springframework.stereotype.Component;
  7.  
  8. import java.util.Date;
  9.  
  10. /**
  11. * this is a acpect
  12. * 切入点
  13. * 在那些方法上起作用
  14. * 在什么时候起作用
  15. *
  16. * @author hsj
  17. * @create 2017-11-11 20:52
  18. **/
  19. @Aspect
  20. @Component
  21. public class TimeAspect {
  22. @Around("execution(* com.nbkj.controller.UserController.*(..))")
  23. public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  24. System.out.println("time aspect start");
  25. Object[] args = proceedingJoinPoint.getArgs();
  26. for (Object arg : args) {
  27. System.out.println(arg.getClass().getName());
  28. System.out.println("arg is " + arg);
  29. }
  30. long startTime = new Date().getTime();
  31. Object obj = proceedingJoinPoint.proceed();
  32. System.out.println("time aspect 耗时" + (new Date().getTime() - startTime));
  33. System.out.println("time aspect end");
  34. return obj;
  35. }
  36. }

过滤器(Filter)         :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片   (Aspect)       :  可以拿到方法的参数,但是却拿不到http请求和响应的对象。

https://www.cnblogs.com/caozx/p/10698433.html

spring boot 拦截 以及Filter和interceptor 、Aspect区别的更多相关文章

  1. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  2. Spring boot 拦截器和过滤器

    1. 过滤器 Filter介绍 Filter可以认为是Servlet的一种“加强版”,是对Servlet的扩展(既可以对请求进行预处理,又可以对处理结果进行后续处理.使用Filter完整的一般流程是: ...

  3. spring boot拦截器配置

    1.在spring boot配置文件application.properties中添加要拦截的链接 com.url.interceptor=/user/test 2.编写拦截器代码 ,创建UrlInt ...

  4. Spring boot拦截器的实现

    Spring boot拦截器的实现 Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力. 1.注册拦截器 @C ...

  5. [转] Spring Boot实战之Filter实现使用JWT进行接口认证

    [From] http://blog.csdn.net/sun_t89/article/details/51923017 Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(j ...

  6. 【spring boot】spring boot 拦截器

    今日份代码: 1.定义拦截器 import com.alibaba.fastjson.JSON; import org.apache.commons.collections.CollectionUti ...

  7. filter和interceptor的区别

    前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...

  8. spring boot:多个filter/多个interceptor/多个aop时设置调用的先后顺序(spring boot 2.3.1)

    一,filter/interceptor/aop生效的先后顺序? 1,filter即过滤器,基于servlet容器,处于最外层, 所以它会最先起作用,最后才停止 说明:filter对所有访问到serv ...

  9. (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API,与Spring 没什么关系.     Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Sprin ...

随机推荐

  1. Mysql 创建只读账户

    mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...

  2. [BZOJ1191]超级英雄Hero

    Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的 多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确 ...

  3. rabbitmq添加user及vhost

    rabbitmqctl add_vhost /myhost # 添加 vhost rabbitmqctl add_user me me123 # 设置用户和密码 rabbitmqctl set_per ...

  4. js中判断变量不为空或null

    var content=$("content").val(); if(!content){      alert("请输出内容!");      return; ...

  5. vue+element 表格导出Excel文件

    https://www.cnblogs.com/bobodeboke/p/8867481.html  非常感谢 这个大佬 才让我搞到了Blob.js 和 Export2Excel.js 如果最后运行时 ...

  6. Windows 安装R

    下载 R 的安装包 双击 安装包 进行安装 安装完成 测试 修改 R 中的CRAN镜像 添加到 Windows 的环境变量中 测试

  7. Swarm容器集群管理(超详细)

    一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...

  8. 【转】谈谈servlet、spring、struts

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  9. 【定制开发】经纪人报备软件 全民经纪人系统 房产中介微信小程序分享家恒房通

    信真科技2019年最先扛鼎之作 - 全民经纪人软件系统 1.含有最基础的经纪人注册.客户报备系统功能: 2.可支持定制开发,针对房企售楼部.中介门店: 3.与微信端绑定使用,方便快捷,快速分享: 4. ...

  10. Android自动化测试--monkey总结

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...