温故一下:拦截器,过滤器,aop 您所在的位置:网站首页 spring拦截器与aop的区别 温故一下:拦截器,过滤器,aop

温故一下:拦截器,过滤器,aop

2023-04-20 13:36| 来源: 网络整理| 查看: 265

拦截器 一、定义:

在面向切面编程中应用的,在方法执行之前或者之后,进行拦截,添加某些操作;基于java的反射机制实现的。拦截是aop的一种实现策略。 在webWork中,拦截器是动态拦截Action调用的对象,提供了一种机制使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个Action执行前阻止其 执行。同时,也提供了一种可以提取Action中可重用的部分的方式。 拦截器从Action中抽出了很多功能,大量减少了Actin中的代码,抽取出的公共方法可以更好的重用。 当我们提交对Action的请求时,ServletDispatcher会根据请求,调度并执行相应的Action;在此Action执行之前,调用被Interceptor截取,Interceptor 在Action执行前后执行。

二、实现方式 一、在ssm中的实现

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。主要有两种方式:

第一种: 定义的Interceptor类  实现Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了

HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;

第二种: 定义的Interceptor类, 实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

二、在springboot中的实现

第一种: 创建类 LogCostInterceptor  实现  HandlerInterceptor 接口;并且 创建配置类WebConfiguration 继承 WebMvcConfigurationSupport (或者 WebMvcConfigurerAdapter);添加 @Configuration注解;

@Configuration public class WebConfiguration extends WebMvcConfigurationSupport { private Logger logger = LoggerFactory.getLogger(WebConfiguration.class); @Override public void addInterceptors(InterceptorRegistry registry){ // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new LogCostInterceptor()).addPathPatterns().excludePathPatterns("/swagger-ui.html"); } } 复制代码 三、拦截器中三个方法的详细解释

SpringMvc的过滤器是链式的,在一个应用中或者一个请求中可以有多个Interceptor,执行顺序按照声明中的顺序执行,先执行每个过滤器中的preHandle方法。

1) preHandle  在请求controller之前执行,可以在方法中进行一些初始化操作或者是对当前请求的一个预处理,也可以设置一些判断决定请求是否要继续下去。返回结果如果是true,则执行后续的Interceptor中的preHandle和controller,如果是false,表示请求结束。

2) postHandle  在preHandle执行为true后,执行该方法。在controller执行之后,在DispatcherServlet进行视图返回渲染之前被调用;在这个方法中可以对ModelAndView对象进行处理。postHandle的执行顺序在链式中和preHandle的执行顺序是相反的,先执行preHandle的过滤器的postHandle后执行。

3) afterCompletion  在preHandle执行为true后执行。 该方法在整个请求结束之后,在DispatcherServlet渲染了对应的视图之后执行。作用: 进行资源清理工作。

过滤器 一 、定义:

filter 实现了 javax.servlet.filter接口的服务器端程序;

二、 用途:

设置字符集、控制权限、控制转向、业务逻辑判断等

三、 工作原理:

在web.xml文件配置需要拦截的客户端请求,它会帮你拦截到请求,此时你可以对请求或相应统一设置编码、简化操作;同时可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等。 随着web应用启动而启动,只需要初始化一次,以后就可以拦截相关请求,只有当web应用停止或重新部署的时候才销毁。 Filter 主要用户对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。

四、 流程:

filter对用户请求进行预处理,将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

五、 用处:

在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

六、 种类:

用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。 日志Filter:详细记录某些特殊的用户请求。 负责解码的Filter:包括对非标准编码的请求解码。 能改变XML内容的XSLT Filter等。 Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。

七、 使用:

创建Myfilter类继承Filter

重写 init 和 doFilter 在init方法中初始化自定义参数,参数名称可以设置为此时的 url,对其执行过滤,也就是放过; 在doFilter中可以进行认证鉴权处理,之后执行相应的逻辑; 也可以进行跨域的设置; 在doFilter中 chain.doFilter(req, res)是对请求和响应处理的分界线,执行该方法之前,即对用户请求进行预处理;

执行该方法之后,即对服务器响应进行后处理

1)第一种方案

a: 在Myfilter类 添加注解 @WebFilter ,可以添加 @Order(1)多个Myfilter的时候 按照顺序执行 @WebFilter的一些参数值 ( filterName = "Myfilter", urlPatterns = "/snow/api/*", initParams = { @WebInitParam(name = "url", value = "/snow/api/login")} ) filterName 拦截的地址 initParams 放过的地址,不需要检测 b: 在springboot的启动类上添加 @ServletComponentScan 复制代码

2)第二种方案

a: 在Myfilter类 添加注解 @Component,交给spring容器处理 b: 创建一个config类,添加注解 复制代码 @Configuration public class config { @Bean public FilterRegistrationBean webAuthFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(myfilte()); registration.setName("Myfilter"); registration.addUrlPatterns("/snow/api/*"); registration.addInitParameter("url", "/snow/api/login"); registration.setOrder(0); //设置顺序 return registration; } @Bean public Filter myfilter() { return new Myfilter(); } } 复制代码 拦截器和过滤器的区别:

image.png

Spring AOP

面向切面拦截的是类的元数据(包、类、方法名、参数等)

相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。

三者使用场景

过滤器,拦截器拦截的是URL。AOP拦截的是类的元数据(包、类、方法名、参数等)。

过滤器并没有定义业务用于执行逻辑前、后等,仅仅是请求到达就执行。

拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。 AOP针对具体的代码,能够实现更加复杂的业务逻辑。

执行顺序

过滤器、拦截器、切面。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有