spring boot 拦截 以及Filter和interceptor 、Aspect区别
一、通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式。这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。
过滤器使用的主要是反射 ;拦截器使用的主要是回调 ;AOP使用的主要是动态代理。
一个请求过来 ,先进行过滤器处理,看程序是否受理该请求。过滤器放过后, 程序中的拦截器进行处理,处理完后进入被AOP动态代理重新编译过的主要业务类进行处理 。
Filter:和框架无关,可以控制最初的http请求,但是更细一点的类和方法控制不了。
Interceptor:可以控制请求的控制器和方法,但控制不了请求方法里的参数(用于处理页面提交的请求响应并进行处理,例如做国际化,做主题更换,过滤等)。
Aspect : 可以自定义切入的点,有方法的参数,但是拿不到http请求,可以通过其他方式如RequestContextHolder获得。
Filter,Interceptor,Aspect 实际上都是对Aop的具体实现。都是对业务逻辑的提取。都可以实现权限检查,日志记录。不同的是使用的范围不同,规范不同,深度不同。
一、Filter
通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式, 这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。
(1)第一种直接写类实现这个接口。代码如下这个要使用Component注解,当你请求服务器的时候他会对每一个请求进行处理。
- package com.nbkj.webFilter;
- import org.springframework.stereotype.Component;
- import javax.servlet.*;
- import java.io.IOException;
- import java.util.Date;
- @Component
- public class TimerFilter implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("Time filter init");
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("Time filter start");
- filterChain.doFilter(servletRequest, servletResponse);
- System.out.println("Time filter finish");
- }
- @Override
- public void destroy() {
- System.out.println("Time filter destroy");
- }
- }
(2)第二种可以在WebConfig中配置,这种配置方式为了使用第三方的Filter没有@Compont注解所以使用。代码如下
- package com.nbkj.config;
- import com.nbkj.webFilter.TimerFilter;
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Web配置
- *
- * @author hsj
- * @Configuration 这个注解声明这个类是配置类
- * @create 2017-11-11 18:00
- **/
- @Configuration
- public class WebConfig {
- @Bean
- public FilterRegistrationBean timeFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean();
- TimerFilter timerFilter = new TimerFilter();
- registrationBean.setFilter(timerFilter);
- List<String> urls = new ArrayList<>();
- urls.add("/*");
- registrationBean.setUrlPatterns(urls);
- return registrationBean;
- }
- }
二、Interceptor
使用Interceptor这种事spring框架自己带的拦截器,代码如下,它会处理自己写的拦截器,也会拦截的拦截BasicErrorController,可以拿到处理的Controller和拿到处理的方法 但是拿不到具体的请求参数。
- package com.nbkj.interceptor;
- 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.persistence.Convert;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.util.Date;
- /**
- * this is spring interceptor
- *
- * @author hsj
- * @create 2017-11-11 18:16
- **/
- @Component
- public class TimeInterceptor implements HandlerInterceptor {
- /**
- * 控制器方法处理之前
- *
- * @param httpServletRequest
- * @param httpServletResponse
- * @param handler
- * @return
- * @throws Exception
- */
- @Override
- public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
- System.out.println("preHandle");
- System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
- System.out.println(((HandlerMethod) handler).getMethod().getName());
- httpServletRequest.setAttribute("startTime", new Date().getTime());
- return false;
- }
- /**
- * 控制器方法处理之后
- * 控制器方法调用不抛异常调用
- *
- * @param httpServletRequest
- * @param httpServletResponse
- * @param o
- * @param modelAndView
- * @throws Exception
- */
- @Override
- public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("postHandle");
- Long startTime = (Long) httpServletRequest.getAttribute("startTime");
- System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
- }
- /**
- * 控制器方法抛不抛异常都会被调用
- *
- * @param httpServletRequest
- * @param httpServletResponse
- * @param o
- * @param e
- * @throws Exception
- */
- @Override
- public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
- System.out.println("afterCompletion");
- Long startTime = (Long) httpServletRequest.getAttribute("startTime");
- System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
- System.out.println("ex is" + e);
- }
- }
添加到拦截器中,WebConfig拦截器注册中心:
- package com.nbkj.config;
- import com.nbkj.interceptor.TimeInterceptor;
- import com.nbkj.webFilter.TimerFilter;
- 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;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Web配置
- *
- * @author hsj
- * @Configuration 这个注解声明这个类是配置类
- * @create 2017-11-11 18:00
- **/
- @Configuration
- public class WebConfig extends WebMvcConfigurerAdapter {
- @Autowired
- private TimeInterceptor timeInterceptor;
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(timeInterceptor);
- }
- }
三、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中配置下面一句:
- <aop:aspectj-autoproxy />
- Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
- AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
- AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名
来访问目标方法中所抛出的异常对象
- After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
- Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint,使用环绕通知,切入要切入的类,当请求的时候回拦截下来,这样可以获取拦截的方法的参数。
- package com.nbkj.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;
- /**
- * this is a acpect
- * 切入点
- * 在那些方法上起作用
- * 在什么时候起作用
- *
- * @author hsj
- * @create 2017-11-11 20:52
- **/
- @Aspect
- @Component
- public class TimeAspect {
- @Around("execution(* com.nbkj.controller.UserController.*(..))")
- public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
- System.out.println("time aspect start");
- Object[] args = proceedingJoinPoint.getArgs();
- for (Object arg : args) {
- System.out.println(arg.getClass().getName());
- System.out.println("arg is " + arg);
- }
- long startTime = new Date().getTime();
- Object obj = proceedingJoinPoint.proceed();
- System.out.println("time aspect 耗时" + (new Date().getTime() - startTime));
- System.out.println("time aspect end");
- return obj;
- }
- }
过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
切片 (Aspect) : 可以拿到方法的参数,但是却拿不到http请求和响应的对象。
spring boot 拦截 以及Filter和interceptor 、Aspect区别的更多相关文章
- 过滤器和拦截器filter和Interceptor的区别
1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...
- Spring boot 拦截器和过滤器
1. 过滤器 Filter介绍 Filter可以认为是Servlet的一种“加强版”,是对Servlet的扩展(既可以对请求进行预处理,又可以对处理结果进行后续处理.使用Filter完整的一般流程是: ...
- spring boot拦截器配置
1.在spring boot配置文件application.properties中添加要拦截的链接 com.url.interceptor=/user/test 2.编写拦截器代码 ,创建UrlInt ...
- Spring boot拦截器的实现
Spring boot拦截器的实现 Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力. 1.注册拦截器 @C ...
- [转] Spring Boot实战之Filter实现使用JWT进行接口认证
[From] http://blog.csdn.net/sun_t89/article/details/51923017 Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(j ...
- 【spring boot】spring boot 拦截器
今日份代码: 1.定义拦截器 import com.alibaba.fastjson.JSON; import org.apache.commons.collections.CollectionUti ...
- filter和interceptor的区别
前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...
- spring boot:多个filter/多个interceptor/多个aop时设置调用的先后顺序(spring boot 2.3.1)
一,filter/interceptor/aop生效的先后顺序? 1,filter即过滤器,基于servlet容器,处于最外层, 所以它会最先起作用,最后才停止 说明:filter对所有访问到serv ...
- (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】
上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API,与Spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Sprin ...
随机推荐
- Mysql 创建只读账户
mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...
- [BZOJ1191]超级英雄Hero
Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的 多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确 ...
- rabbitmq添加user及vhost
rabbitmqctl add_vhost /myhost # 添加 vhost rabbitmqctl add_user me me123 # 设置用户和密码 rabbitmqctl set_per ...
- js中判断变量不为空或null
var content=$("content").val(); if(!content){ alert("请输出内容!"); return; ...
- vue+element 表格导出Excel文件
https://www.cnblogs.com/bobodeboke/p/8867481.html 非常感谢 这个大佬 才让我搞到了Blob.js 和 Export2Excel.js 如果最后运行时 ...
- Windows 安装R
下载 R 的安装包 双击 安装包 进行安装 安装完成 测试 修改 R 中的CRAN镜像 添加到 Windows 的环境变量中 测试
- Swarm容器集群管理(超详细)
一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...
- 【转】谈谈servlet、spring、struts
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 【定制开发】经纪人报备软件 全民经纪人系统 房产中介微信小程序分享家恒房通
信真科技2019年最先扛鼎之作 - 全民经纪人软件系统 1.含有最基础的经纪人注册.客户报备系统功能: 2.可支持定制开发,针对房企售楼部.中介门店: 3.与微信端绑定使用,方便快捷,快速分享: 4. ...
- Android自动化测试--monkey总结
什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...